我目前正在阅读《理解和使用C指针》这本书,我在其中遇到了以下例子:
作者随后展示了arr1[0][0]...arr1[2][2]的内存布局,可以看到元素被存储在连续的区域中。
对于这个例子,我有两个问题:
1. 我不明白为什么在声明arr1时需要第一个方括号,也就是说,与以下声明有何区别:
我读到的是:arr1被声明为一个包含指向整数的指针的数组。
2. 我真的不明白为什么这个例子会导致一个连续的块。因为: 如果我初始化一个数组,我会写成:
并用逗号分隔列出元素。现在,在上面的例子中,arr1的元素应该是指针(除非我对声明的理解有误)。因此,我认为第一个成员应该是
创建一个包含0、1、2的数组,并返回其地址(这对应于int[]的转换),然后将其作为第一个指针的值使用。然而,如果这是真的,那么数字0、1、2将位于与数字3、4、5可能不同的内存段中。
有人能进一步解释一下吗?
int (*(arr1[])) = {(int[]){0,1,2}, (int[]) {3,4,5}, (int[]){6,7,8}}
作者随后展示了arr1[0][0]...arr1[2][2]的内存布局,可以看到元素被存储在连续的区域中。
对于这个例子,我有两个问题:
1. 我不明白为什么在声明arr1时需要第一个方括号,也就是说,与以下声明有何区别:
int *(arr1[]) = ...
我读到的是:arr1被声明为一个包含指向整数的指针的数组。
2. 我真的不明白为什么这个例子会导致一个连续的块。因为: 如果我初始化一个数组,我会写成:
a = {...}
并用逗号分隔列出元素。现在,在上面的例子中,arr1的元素应该是指针(除非我对声明的理解有误)。因此,我认为第一个成员应该是
int *(arr1[])= {(int[]){0,1,2},...
创建一个包含0、1、2的数组,并返回其地址(这对应于int[]的转换),然后将其作为第一个指针的值使用。然而,如果这是真的,那么数字0、1、2将位于与数字3、4、5可能不同的内存段中。
有人能进一步解释一下吗?