这是一个代码,用于打印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);
}
为了理解添加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
答案 0 :(得分:10)
以下int array[4][3];
适用
array
是一个包含4个元素的数组。每个元素都是一个包含3 int
s的数组。在大多数情况下,使用名称本身会使数组衰减为指向其第一个元素的指针;然后array
成为指向3 int
s
array + 1
是指向3个int的数组的指针。这里array
衰减为指针而1
指的是3 int
&array
是整个数组的地址。它指向4个数组的数组的类型为3个int的对象
&array + 1
是4个3个数组的伪 - 数组数组的第2个(实际上不存在)元素
array[0]
是一个包含3个整数的数组。它通常衰减到指向第一个元素的指针
array[0] + 1
指向int
array[0]
数组为3 int的对象的 &array[0]
地址
&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]
答案 1 :(得分:3)
如果将其编译为C ++,则可以使用typeid
STL库中的typeinfo
运算符来获取此信息。例如,运行此
#include <stdio.h>
#include <typeinfo>
void main()
{
int array[4][3];
printf("array %s\n",typeid(array).name()); //of type int(*)[3]
printf("array+1 %s\n",typeid(array+1).name());
printf("&array %s\n",typeid(&array).name()); //....???
printf("&array+1 %s\n",typeid(&array+1).name());
printf("array[0] %s\n",typeid(array[0]).name()); //of type int*
printf("array[0]+1 %s\n",typeid(array[0]+1).name());
printf("&array[0] %s\n",typeid(&array[0]).name()); //....???
printf("&array[0]+1 %s\n",typeid(&array[0]+1).name());
}
给我以下结果
array int [4][3]
array+1 int (*)[3]
&array int (*)[4][3]
&array+1 int (*)[4][3]
array[0] int [3]
array[0]+1 int *
&array[0] int (*)[3]
&array[0]+1 int (*)[3]
这解释了为什么添加1可以将指针增加4个字节(单个int),12个字节(int [3])或48个字节(int [4] [3])。