最近在开发中使用到了C风格的数组,在对数组地址进行增减操作时有些疑惑,现在将这些要点总结下来,方便查阅。

数组的名称也就是数组的地址

数组的命令与数组地址在数值上是相同的。可以对数据名称进行取地址操作,获得的值也是数组的地址。可以通过以下代码段进行验证。

char arr[16];
printf("arr  = %#x\n", arr);
printf("&arr = %#x\n", &arr);

上述代码段从运行结果上来看,二者的数值是相同的。

数组地址移动数组单个元素大小的距离

对数组的首地址进行增加可以取得数组中某个元素的地址。通过数组地址和元素下标就能够以 O(1) 效率取得元素内容,这是数组非常重要的特点之一。

但是在使用时我会有疑问,直接对数组名称进行增加,地址移动的幅度是单个元素的大小还是整个数组的大小呢?答案是单个元素的距离。

可以通过以下代码段进行验证。

char arr[16];
printf("arr     = %#x\n", arr);
printf("arr + 1 = %#x\n", arr + 1);

上述代码段的运行结果显示上下数值相差0x01,也就是一个 char 的大小。

数组地址移动整个数组大小的距离

这时你可能会想,如果真的需要移动整个数组的距离呢?

对数组名称取地址再增加,地址移动的幅度是整个数组的大小。

可以通过以下代码段进行验证。

char arr[16];
printf("arr      = %#x\n", arr);
printf("&arr + 1 = %#x\n", &arr + 1);

上述代码段的运行结果显示上下数值相差0x10,也就是整个数组的大小。

tips: 因为 arr 的数据类型是 char* ,是第一个元素的地址。而 &arr 的数据类型是 char(*)[16] ,是该数组的地址。它们的值是相同的,因为都指向同一块内存,但它们的数据类型不同,在进行累加时移动的距离不同。