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