指针学习遇到的三个问题以及解决办法

 

第一个问题:

 

上边这个图中打印出来的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在指针定义之前和定义之中的时候,这个时候指针不能改变,指针指向的内容也是不能改变的,测试如下图:

 

posted @ 2016-11-30 18:40  杨静远  阅读(331)  评论(2编辑  收藏  举报