指针学习遇到的三个问题以及解决办法
第一个问题:
上边这个图中打印出来的ptr1的地址和&ptr1的地址分别是什么的地址?
我最初的理解的ptr1的地址就是ptr1这个指针变量自己的地址,&ptr1的地址就是ptr1这个指针指向的地址,也就是这个程序中urn这个字符数组的首地址。
我向娄老师提问,我的理解是否正确,最后老师的建议是自己进行编程来解决。后来我就想ptr这个指针肯定是与urn这个指针是有关的,因此就写程序把urn的地址也打出来进行比较就知道了。
运行结果是:
从运行结果中自然就可以看出ptr1的地址和urn的地址是一样的。然后再看程序中“ptr1 = urn;”这一句是把urn的地址赋给了ptr1,结合运行结果就是ptr1现在和urn指向同一个地址,也就是把一个地址赋给指针之后,这个指针的地址就是这个地址。ptr1的地址没有问题了,但是打印出来&ptr1的地址也打印出来与ptr1的地址不同,经过思考,ptr1是指针,但是指针也是占4个字节的内存空间的,&ptr1的地址就是存放ptr1这个指针的地址。
通过这两个对比来说,也就更明确了,地址赋值给指针,那么这个地址就是指针的地址,不是存放指针的地址。另外,存放指针的地址可以赋值给其他指针,这就是指针的指针,这些东西理解好了,应该对以后的链表的学习有帮助。
第二个问题:
在书中讲const关键字的时候提到了const关键字在指针变量之前时,指针p是可以改变的,指针所指向的内容是不可改变的。比如:
int const a = 100;
cons tint *p;
p = &a;
这里指的指针所指向的内容不可变是指p的类型不可变,只能是整数型还是指a的值不能变?
从程序中可以看出,指针p指向的是变量a,指针指向的内容是a。程序的执行结果来看,a的值是可以改变的。
从程序运行结果来看修改指针p也是可以的。
在定义变量a的时候,定义为int const a = 100;的时候才会出现错误,也就是指针指向的变量a的值是不能改的。但是,这个跟const int *p没有任何关系,即使只定义int const a这个变量,a的值也是不能修改的。
经过一晚上的思考和问老师,最后又通过写程序发现,它这里所说的指向的内容不能变是指不能通过*p去改指针的内容,如果指针指向变量a的,那么你直接修改变量a的值是可以的,但是不能用“*p = a;”,如下图所示:
第三个问题:
在书中讲const关键字的时候提到了const关键字在指针变量的定义之中,指针p的值不能改变,指的是指针只能指向某个地址不能改变吗?如果是这样的话(看下面的代码),p就是只能指向a的地址不能再改变了吗?那这样的话是不是改变a的值再打印*p的值就是已经修改过的a的值。
int a = 100;
int * const p = &a;
从上图的运行结果看出来,p指针的指向确实不能改变。这样的话,p指针一直指向的是变量a的地址,也就是说修改a的值等于修改了*p得值,编程如下:
经过运行发现,改变a的值确实就等于修改了*p的值。
最后关于const指针的的就是const在指针定义之前和定义之中的时候,这个时候指针不能改变,指针指向的内容也是不能改变的,测试如下图: