c语言-指针

来源:互联网 发布:最大子数组 动态规划 编辑:程序博客网 时间:2024/06/06 00:06

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------


地址指针的基本概念

指针式c语言中广泛使用的一种数据类型。利用指针变量可以表示各种数据结构,能更方便的使用数组和字符串。


变量的指针就是变量的地址,存放变量地址的变量就是指针变量。


程序中为了表示指针变量和其指向的变量之间的关系,在程序中用“*”符号表示指向


指针变量的类型说明

  对指针变量的类型说明包括三个内容:
(1)指针类型说明,即定义变量为一个指针变量;
(2)指针变量名;
(3)变量值(指针)所指向的变量的数据类型。
   其一般形式为: 类型说明符 *变量名;
   其中,*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。


   例如: int *p1;表示p1是一个指针变量,它的值是某个整型变量的地址。 或者说p1指向一个整型变量。至于p1究竟指向哪一个整型变量, 应由向p1赋予的地址来决定。


   再如:
staic int *p2; /*p2是指向静态整型变量的指针变量*/
float *p3; /*p3是指向浮点变量的指针变量*/
char *p4; /*p4是指向字符变量的指针变量*/ 应该注意的是,一个指针变量只能指向同类型的变量,如P3 只能指向浮点变量,不能时而指向一个浮点变量, 时而又指向一个字符变量。



指针变量在使用之前不仅要定义说明,而且要赋予具体的指,未经赋值的指针变量不能使用,要不然的话会造成系统混乱。指针变量只能赋予地址,绝不能赋予任何其他的数据,不然的话会引起错误。


有两个相关的运算符

1.&取地址运算符

2.*指针运算符(也称之为简介访问)

1.指针变量初始化的方法

int a;

int *p=&a;


赋值语句的方法

int a;

int *p;

p=*a;

补可以吧一个数赋予指针变量,故下面的赋值是错误的:

int p;

p=1000;

被赋值的指针变量前不能再加“*”说明符,如果写为*p=&a,那这说明起也是错误的

指针变量的运算

  指针变量可以进行某些运算,但其运算的种类是有限的。 它只能进行赋值运算和部分算术运算及关系运算。
1.指针运算符

(1)取地址运算符&
   取地址运算符&是单目运算符,其结合性为自右至左,其功能是取变量的地址。在scanf函数及前面介绍指针变量赋值中,我们已经了解并使用了&运算符。

(2)取内容运算符*
   取内容运算符*是单目运算符,其结合性为自右至左,用来表示指针变量所指的变量。在*运算符之后跟的变量必须是指针变量。需要注意的是指针运算符*和指针变量说明中的指针说明符* 不是一回事。在指针变量说明中,“*”是类型说明符,表示其后的变量是指针类型。而表达式中出现的“*”则是一个运算符用以表示指针变量所指的变量。


通过指针访问所之乡的一个变量是以简洁访问的形式进行的,索引比直接访问一个变量要费时间,而且并不指关,因为通过指针访问哪一个变量,取决于指针的指(即指向),例如*p2=*p1,实际上就是j=i


  对于指向数组的指针变量,可以加上或减去一个整数n。设pa是指向数组a的指针变量,则pa+n,pa-n,pa++,++pa,pa--,--pa 运算都是合法的。指针变量加或减一个整数n的意义是把指针指向的当前位置(指向某数组元素)向前或向后移动n个位置。应该注意,数组指针变量向前或向后移动一个位置和地址加1或减1 在概念上是不同的。因为数组可以有不同的类型, 各种类型的数组元素所占的字节长度是不同的。如指针变量加1,即向后移动1 个位置表示指针变量指向下一个数据元素的首地址。而不是在原地址基础上加1。
例如:
int a[5],*pa;
pa=a; /*pa指向数组a,也是指向a[0]*/
pa=pa+2; /*pa指向a[2],即pa的值为&pa[2]*/ 指针变量的加减运算只能对数组指针变量进行, 对指向其它类型变量的指针变量作加减运算是毫无意义的。(3)两个指针变量之间的运算只有指向同一数组的两个指针变量之间才能进行运算, 否则运算毫无意义。

①两指针变量相减
两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。实际上是两个指针值(地址) 相减之差再除以该数组元素的长度(字节数)。例如pf1和pf2 是指向同一浮点数组的两个指针变量,设pf1的值为2010H,pf2的值为2000H,而浮点数组每个元素占4个字节,所以pf1-pf2的结果为(2000H-2010H)/4=4,表示pf1和 pf2之间相差4个元素。两个指针变量不能进行加法运算。 例如, pf1+pf2是什么意思呢?毫无实际意义。

②两指针变量进行关系运算
指向同一数组的两指针变量进行关系运算可表示它们所指数组元素之间的关系。例如:
pf1==pf2表示pf1和pf2指向同一数组元素
pf1>pf2表示pf1处于高地址位置
pf1<pf2表示pf2处于低地址位
说明pa,pb为整型指针变量

给指针变量pa赋值,pa指向变量a。
给指针变量pb赋值,pb指向变量b。
本行的意义是求a+b之和,(*pa就是a,*pb就是b)。
本行是求a*b之积。
输出结果。
输出结果。

......


指针变量还可以与0比较。设p为指针变量,则p==0表明p是空指针,它不指向任何变量;p!=0表示p不是空指针。空指针是由对指针变量赋予0值而得到的。例如: #define NULL 0 int *p=NULL; 对指针变量赋0值和不赋值是不同的。指针变量未赋值时,可以是任意值,是不能使用的。否则将造成意外错误。而指针变量赋0值后,则可以使用,只是它不指向具体的变量而已。


数组指针

1)指向数组的指针

2)使用数组指针间接访问数组的元素

3)数组指针的定义

     int *p;

4)数组指针的初始化

    int a[4]={1,2,3,4};

    int*p=a;//数组指针,定义一个指针变量p赋值数组的首地址

   (第一个元素地址),p指向第一个元素

    int *p=&a[0];

指针数组

1)存放指针的数组

2)指针数组的定义:

    数据类型 *数组名[数组长度];

 例:int *pa[3];

//定义了一个指针数组,数组名是pa,可以用来存放3个指针(必须是int类型的变量指针)

3)两个指针之间的减法运算

例:ox0006-ox0003=3(没意义)

常见的用法:两个指针都指向同一个数组

1)判断两个指针变量指向的元素是否连续

2)半段两个指针变量之间相隔几个元素

例:

int a[5]={1,2,3,4,5};

int *p=a;//数组指针,定义了一个指针变量p赋值数组的首地址

(第一个元素的地址),怕指向数组的第一个元素

int *p=&a[0];//等同于上面一句话

使用指针数组引用数组元素


int main ( 

     int a[4]={1,2,3,4};

    数组指针

    int *p=a;//创建指针p指向数组第一个元素

    //用数组指针便利数组

 for (int i=0;i<4;i++){


         printf("%d\t",*p++);


     }

      return 0;

}

指针数组

1)存放指针的数组,就是指针数组

2)指针数组的定义:

  数据类型*数组名[数组长度];

例:int *pa[3];

//定义一个名为pa的指针数组,长度为3(注意必须是int类型的变量指针)


二维数组指针

定义一个指针变量,让这个指针变量指向一维数组的元素(一维数组指针定义)

二维数组指针

行指针,用来指向二维数组的每一行存放的事行的首地址

定义格式:数据类型(*行指针变量名)[数组的第二位的长度];

二维数组的初始化

例:int a[2][3];

       int b  [2][4];

//假设要定义一个指向数组a的一个行指针

a=&a[0]=&a[0][0]

int (*p)[3]=a;

字符串指针


定义:char*字符串指针变量名=“字符串内容”;

用途:用于保存一个字符串

注意:1)指针变量都是占用8个字节

           2)指针变量可以重新指向一个字符串的常量,并保存的事心的字符串常量的首地址

           3)*(str+2)=‘x’;这是错误的,因为字符串常量实在常量区保存的,不能修改,再常量区保存的数据都是                  只读的。





  




0 0
原创粉丝点击