这是一个代码,用于打印2D数组的第一个元素的地址,然后添加1.尽管所有4个基址都相同,但由于它们的"类型"不同,它们的加法显然不会给出相同的结果.我可以找出一些类型(如果它们是正确的)但不是全部.
int main()
{
int array[4][3];
printf("array %u\n",array); //of type int(*)[3]
printf("array+1 %u\n",array+1);
printf("&array %u\n",&array); //....???
printf("&array+1 %u\n",&array+1);
printf("array[0] %u\n",array[0]); //of type int*
printf("array[0]+1 %u\n",array[0]+1);
printf("&array[0] %u\n",&array[0]); //....???
printf("&array[0]+1 %u\n",&array[0]+1);
}
Run Code Online (Sandbox Code Playgroud)
您能否详细解释每个基址的"类型",以便了解添加1后所涉及的指针算法.下面给出了gcc机器的示例输出,以供快速参考.
array 3214383040
array+1 3214383052
&array 3214383040
&array+1 3214383088
array[0] 3214383040
array[0]+1 3214383044
&array[0] 3214383040
&array[0]+1 3214383052
Run Code Online (Sandbox Code Playgroud)
pmg*_*pmg 10
有int array[4][3];以下适用
array是一个包含4个元素的数组.每个元素都是一个3 ints 的数组.在大多数情况下,使用名称本身会使数组衰减为指向其第一个元素的指针; 然后array成为指向3 ints 数组的指针
array + 1是一个指向3个int数组的指针.这里array衰减到指针和1引用3的数组int
&array是整个数组的地址.它指向4个数组的数组的类型为3个int的对象
&array + 1是4个3个数组的数组的伪数组的第二个(实际上不存在)元素
array[0]是一个3个整数的数组.它通常衰减到指向第一个元素的指针
array[0] + 1指向第二个int中array[0]
&array[0] 3个int类型的对象的地址
&array[0]+1 3个整数数组的第二个元素
PS.午饭后我会尝试画一幅画(ASCII).
嗯......画很难:)
在尝试之前,我想我可以做出更好的绘画.这是我能想到的最好的......
int array[4][3] ........[aaabbbcccddd]........
where aaa, bbb, ccc, ddd are arrays of 3 ints'
the [] represent the object itself; the {} represent pointers.
array (object) ........[AAABBBCCCDDD]........ int[4][3]
array (decayed) ==> ........{aaa}bbbcccddd........ int(*)[3]
array + 1 ==> ........aaa{bbb}cccddd........ int(*)[3]
&array ==> ........{aaabbbcccddd}........ int(*)[4][3]
&array + 1 ==> ........aaabbbcccddd{xxxxxxxxxxxx}........ int(*)[4][3]
array[0] (object) ........[AAA]bbbcccddd........ int[3]
array[0] (decayed) ==> ........{a}aabbbcccddd........ int*
array[0] + 1 ==> ........a{a}abbbcccddd........ int*
&array[0] ==> ........{aaa}bbbcccddd........ int(*)[3]
&array[0] + 1 ==> ........aaa{bbb}cccddd........ int(*)[3]