以下是引用zhu_zhi在2014-2-15 23:10:07的发言:
楼主真是高啊!实在是高。
分析我原来代码的错误很到位,谢谢!
看你的分析,有两个收获:
1、知道错误所在,不应以**p为循环的上下限,因为**p是不断变化的,而是应该以数组a参照物。
2、因为错用**x,第一次知道实体和二级指针的区别,虽然现在还不是很明白。
再次感谢楼主!
呃,为了防止你理解错我的意思走了弯路,我觉得我有必要再解释一下“实体”的概念。
这个词是我用来描述“指针所指向的地址处的
合法的变量”的。这不是个通用的官方的定义,是我个人的定义。
我很担心别因为我的表达能力有限而导致你理解错误。这里啰嗦两句希望能够解释清楚。
所谓“变量”是一段合法内存,你可以向其中写入或读取数据。
所谓“合法”是指拥有相应的权限(读、写,或二者兼有)。从80286开始的中央处理器具有了保护功能,这使得操作系统可以控制你对内存空间的使用。你只能操作系统分配给你的那部分内存。对其它内存的操作尝试将导致内存读写错误,操作系统可能会给你个警告或直接杀掉你的进程。
所谓“指针”它本身也是一个变量,只不过这个变量所存储的内容是一个地址值。对应这个地址值的变量就是该指针所指向的变量。如果这个变量是合法的,那么它就是我所说的“实体”。
C语言对全局和静态的没有初始化的变量会赋默认初始值(一般是0),但对局部变量不会赋予初始值。
所以如果声明一个局部的指针变量且没有给它赋过值的话,它的值可能是任何数,或者说这个指针可能指向任何一处内存。它所指向的内存可能是你可以操作的,也可能是你不能操作的。这样的指针称作“悬浮指针”。(这个词是比较通用的)
指针可以指向任何变量。如果一个指针(A)所指向的变量(B)也是一个指针,那么这个指针(A)称作(指向指针的指针)。(注意,这里还不能说它是二级指针)
如果指针(B)指向的是其它类型变量(比如char、int、struct、...),那么指针(A)可以称作指向这个类型的“二级指针”。
指针(B)也可以还是一个指针。那么这时的指针(a)可以是三级、四级、...、N级指针。但总可以称它为(指向指针的指针)。
不管(B)是什么,我所说的“指针(A)所指向的实体”都是指它。
关于多级指针最多可以有多少级。理论上可以有任意级,但实际中应编译器而异。任何编译器都只支持有限级的指针,具体某个支持多少级我没查过,有兴趣你可以自己测试一下(尝试申请前面加足够多的星号的指针),但满足ANSI标准的编译器至少支持12级指针。
这属于理论方面的东西了,实际应用中最常用的是一级指针,二级指针的使用都不算多,三级指针应用绝少。如果你的程序需要用到三级以上的指针,那么可以考虑换一个算法了。
指针其实并不是一个复杂的概念,只是应用中需要很谨慎。如果你的程序因指针指向了非法的位置而报错,你应该庆幸。如果它指向一个合法但不是你该操作的位置,如果你没有及时发现,那很可能造成灾难性的损失(比如月兔车的行为控制程序)。