这是一个打印2D数组的第一个元素的地址,然后加1的代码。尽管所有4个基地址都是相同的,但是由于它们的“类型”不同,它们加1显然不会给出相同的结果。我可以弄清楚某些类型(如果它们是正确的)的类型,而不是全部。
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);
}
您能详细解释每个基址的“类型”以了解加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
最佳答案
具有int array[4][3];
时,以下条件适用array
是一个包含4个元素的数组。每个元素是一个包含3个int
的数组。在大多数情况下,仅使用名称本身会使数组衰减为指向其第一个元素的指针。然后array
成为指向3个int
数组的指针array + 1
是一个指向3个整数的数组的指针。此处array
衰减为指针,而1
则指向3个int
的数组&array
是整个数组的地址。它指向3个整数的4个数组的类型为array的对象&array + 1
是3个int的4个数组的伪数组的第二个元素(实际上不存在)array[0]
是3个整数的数组。它通常会衰减为指向第一个元素的指针array[0] + 1
指向int
中的第二个array[0]
类型为3个整数的对象的&array[0]
地址&array[0]+1
3个整数的数组的第二个元素
PS。午饭后我将尝试绘制一个图形(ASCII)。
嗯...绘画很难:)
在尝试之前,我认为我可以做一个更好的绘图。
这是我能想到的最好的...
int array [4] [3] ........ [aaabbbcccddd] ...
其中aaa,bbb,ccc,ddd是3个整数的数组
[]代表对象本身; {}代表指针。
数组(对象)........ [AAABBBCCCDDD] ... int [4] [3]
数组(已衰减)==> ........ {aaa} bbbcccddd ..... int(*)[3]
数组+ 1 ==> ........ aaa {bbb} cccddd ..... int(*)[3]
&array ==> ........ {aaabbbcccddd} ... int(*)[4] [3]
&array + 1 ==> ........ aaabbbcccddd {xxxxxxxxxxxx} ... int(*)[4] [3]
数组[0](对象)........ [AAA] bbbcccddd ........ int [3]
array [0](已衰减)==> ........ {a} aabbbcccddd ........ int *
array [0] + 1 ==> ........ a {a} abbbcccddd ........ int *
&array [0] ==> ........ {aaa} bbbcccddd ........ int(*)[3]
&array [0] + 1 ==> ........ aaa {bbb} cccddd ..... int(*)[3]
关于c - 2D数组中的数据类型困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5181237/