分类: C/C++
2009-10-11 16:03:42
|
首先我们要知道以下定义:
int (*p)[3];
p = &a;
p是一个指向具有3个int型元素的数组的指针。简称数组指针。
p+1的结果:为了更好地回答这个问题,我们来看如下定义:
int *r;
r = a;
r是一个指向int型元素的指针。
r+1我们都可以知道就是数组a[1]的地址。数组a的每个元素都是占四个字节的int型。这四个字节被编译器看作一个整体。r+1的具体算法如下:r+1 = r + sizeof(int)。
此时我们来看一下p+1:注意上面出现的两句话:
p是一个指向具有3个int型元素的数组的指针。
r是一个指向int型元素的指针。
r+1时编译器会把int里四个自己看作一个整体,p+1编译器也会把int里的四个自己看作一个整体。但是p是一个指向具有3个int型元素的数组的指针,所以p+1 = p + (sizeof(int))*3。
即p+1指向了a[3]的地址。
&a+1 = p+1 = &(a+3)
*(&a+1) = *(p+1) = &a[3];
(&a+1)-&a = p+1-p = 1;
*(&a+1) - a = &a[3] - &a[0] = 3.
最后一个就不用我分析了。
我在这里还想说一点,就是关于对数组a取地址的用法:&a。其实这个程序的苦涩都是这个用法惹的祸。我认为编译器应该对这种用法加以限制。毕竟它是没法解释的。因为a是一个指针常量,我们是不能对常量取地址的。可是目前的编译器都对它放任.
希望对这个有研究的提点意见啊。谢谢了。