指针--------存储地址的变量 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。
浅议指针
时间: 2024-10-07 19:14:32