关于数组指针的一些猜想

先看一个问题,输出结果是什么?
关于数组指针的一些猜想
如果说你认为结果是
2 , 2
那你就天真了。
正确结果是 2 ,5

下面分析一下
*(a + 1) = 2这是毫无疑问的

那为什么
*(p - 1) = 5 呢?

这是因为&(a + 1)与(a + 1)根本不是一回事

不是说好数组名a与数组名取地址&a和数组首元素a[0]都是一个地址吗?

是的,在某种程度可以这么理解

回想一下指针加一的操作,系统是怎么知道我们的加一操作地址是加多少呢,int类型指针加一地址加4,而char类型指针加一地址却加1,这说明系统保存指针的时候很可能还有一个保存指针指向的类型的东西,这个东西可能就是表示被指向内容所占的空间大小,暂且叫它“指针空间”吧。所以int类型“指针空间”就是4,而char类型“指针空间”是1。
可以理解成一个结构体
struct{
Addr;//这个是指针指向的地址
Size;//这个是指针指向变量的类型
}

已知前面&(a)与(a)指向的地址一样,那只有“指针空间”不一样了。

&a表示取整个数组的地址,所以“指针空间“是整个数组的大小20,(&a + 1)实际上加一操作增加了sizeof(a) = 4 * 5 = 20个内存单元,此时(&a + 1)指向数组的第六个元素a[5],很明显是越界了。

再看上面第三行代码int *p = (int )(&a + 1)
这里强制转换的时候”指针空间“由20变成4了,所以p实际上只是单纯指向一个元素,不难思考,最后printf打印的是
(p - 1)实际就是a[4]。

所以上面程序运行结果是2 , 5

最后,下面代码运行结果又是多少呢?关于数组指针的一些猜想