首页 > 代码库 > 浅议指针

浅议指针

指针--------存储地址的变量
int  a=5;
int*  p=&a;
int  b=*p;

执行以上操作后,b这个整型变量里的值是多少?  答 : 5   
  p这个变量里的值是多少?  答 : a的地址(不是int型数字5!)   

为什么呢?
int  a=5; 这是个最常见的定义变量并赋值语句,执行该句后,内存中会分配出一个4个字节(通常为4个字节,具体大小由系统决定)大小的空间,该空间的名字为a,并把数字5赋值到了该空间,并且该空间只能用来存放整型数字,当然该空间会有一个内存地址(每个变量是放在内存中的,系统会自动为该变量分配一个地址,该地址不是我们能决定的),用运算符&就可以得到该空间的地址(&a),该地址也是一种类型的数值,但这种类型既不是int型,也不是double,float型,那这种类型值应该赋值给一个什么类型的变量呢?我们可以这样定义一个变量int*  p;(不建议写成int  *p,*p会让人误以为定义了一个变量*p,*p显然不是一种合法的标示符!)p这个变量就变成了一个专门用来存放int型整数地址的变量,注意:p也是一个变量!也有类型!它的类型是int* 型(不是int型!)!,它的大小通常是4个字节,所以我们可以把一个整型数字的地址赋值给这个变量,前面已经说过了,要想得到int型变量的地址,只需使用&运算符就行,所以我们可以通过这种方式int*  p=&a;把int型变量的内存地址赋值给p变量(p就是一个指针!因为这个变量是int*  p这样定义的,这就决定了p这个变量是专门用来存放int型变量地址的变量,此时,我们可以说p指向了a)

再来看int  b=*p;这句,*p意思就是说拿着p变量里的值(当然是一个地址),去找这个值表示的内存空间(即:p指向的内存空间),执行int*  p=&a;后,p的值已经变成了a在内存中的地址,所以执行int  b=*p;后,b就变成了5。

int  a=5;
int*  p=&a;
int  b=*p;
以上3句总共定义了几个变量?开辟了几个空间?各变量值是多少?
答:3个变量,3个空间,a的值为5(假定该变量在内存中的地址为0x123 (地址通常用16进制数字表示)),p的值为0x123(前面已经假定a的地址为0x123,当然该变量也会有一个内存地址,该地址可能为0x122 (当然也可能为其他值,但p总会有个地址!)),b的值为5(该变量当然也有内存地址!)

疑惑点:
  int*  p;和*p;这两中* p竟然会有不同的用法,老是弄不清到底怎么用。
  若为了让初学者更易学会指针,其实c语言完全可以再增加几种基本类型,如:intp型,doublep型,floatp型,这几种类型和int,double,float等级完全并列,intp类型就是一个专门用来定义存储整型变量地址的变量,如:int  a; intp  p=&a;doublep型,floatp型同理。
  使用该变量p指向的变量时可以调用一个函数int  intvalue(intp  p);来得到p指向的int型变量的值,若增加这两中用法后初学者会很易的学会使用指针,而不必纠结与两只*p,但由于可以用struts定义自定义类型,该类型的变量也有地址,若想得到这种类型变量的地址怎么办呢,显然用上面的方式已经不能满足需求,所以c语言直接使用了*这种方式来定义存储这种类型变量的地址的变量。
  
总结:
  int*  p=&a;定义了一个变量,p这个变量就变成了一个专门用来存放int型整数地址的变量,当然该变量可以被赋值。*p意思就是说拿着p变量里的值(当然是一个地址),去找这个值表示的内存空间(即:p指向的内存空间),执行int*  p=&a;后,p的值已经变成了a在内存中的地址,所以执行int  b=*p;后,b就变成了5。