这是一个打印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/

10-11 23:02
查看更多