话不多说,直接上代码运行,运行如下代码
#include <stdio.h>
int main()
{
int *arry[10];
int (*arryp)[10] = &arry;
for (int i = 0; i < 10; i++)
{
printf("arry[%d]的地址为: %p\n",i,&arry[i]);
printf("arryp[%d]的地址为: %p\n", i, arryp[i]);
}
}
运行结果
arry[0]的地址为: 00D9FC8C
arryp[0]的地址为: 00D9FC8C
arry[1]的地址为: 00D9FC90
arryp[1]的地址为: 00D9FCB4
arry[2]的地址为: 00D9FC94
arryp[2]的地址为: 00D9FCDC
arry[3]的地址为: 00D9FC98
arryp[3]的地址为: 00D9FD04
arry[4]的地址为: 00D9FC9C
arryp[4]的地址为: 00D9FD2C
arry[5]的地址为: 00D9FCA0
arryp[5]的地址为: 00D9FD54
arry[6]的地址为: 00D9FCA4
arryp[6]的地址为: 00D9FD7C
arry[7]的地址为: 00D9FCA8
arryp[7]的地址为: 00D9FDA4
arry[8]的地址为: 00D9FCAC
arryp[8]的地址为: 00D9FDCC
arry[9]的地址为: 00D9FCB0
arryp[9]的地址为: 00D9FDF4
从上面的输出我们可以看书,arry里面保存的地址相差四个地址,而arryp里面的地址相差40个地址、同样都是对一个变量取地址,为什么区别那么大呢?
首先,我们需要对定义的两个变量进行解析
int *arry[10];
按照c语言的运算符顺序,该变量解释为,先定义一个数组,数组里面可以存放10个元素,每个元素的类型为int*,也就是说,这是一个数组,数组里面每个元素的类型都是整数类型的指针
int (*arryp)[10] = &arry;
以上代码解释为,定义了一个指针变量,该变量能存放10个数组的首地址,数组里面存放的元素类型为int型
由此可知,arry为定义一个数组,里面存放了10个int元素的指针,每个int类型为4个字节,10个元素共计40个字节。这也就为什么会存在arry + 1只增加4个地址,而arryp+1增加40个地址的原因了,前者的加1步进为4个地址,加1,表示加一个int类型的大小,而后者+1,表示加一个数组地址的大小,而代码中赋值的首地址为40个字节,故+1就加了40个字节
从打印的arry的最后一个地址和arryp的第二个地址不难看书,两个地址相差了4个地址,这不正是一个整型地址的大小吗