int s[4][2]={1,2,3,4,5,6,7,8};
printf("\n%u,%d",s+1,*(s+1));
Ans 2665496,2665496
在二维数组(s + 1)中给出第二行的地址,但为什么*(s + 1)没有给出值3?
答案 0 :(得分:6)
正如您所说,s+1
是第二行的地址。因此,*(s+1)
或更具可读性s[1]
是一行,而不是数字。所以它不能有“价值3”。
答案 1 :(得分:1)
s
的类型为int [4][2]
,即它是一个数组数组。
在大多数表达式中使用,它被隐式转换为指向其第一个参数的指针,类型为int (*)[2]
,即指向数组的指针。因此s+1
具有类型int (*)[2]
,指向数组的指针。这是指向第二行的指针(不是int,而是整行)。
*(s+1)
是指向数组的指针的解除引用。因此,它具有类型int [2]
,即一组int。
与上面的s
一样,通过在大多数上下文中使用它(一个数组)(在这种情况下作为printf
的参数),它会被隐式转换为指向其第一个元素的指针,即键入int *
指向int的指针。这是指向值为3的int的指针。
由于你打印它们假装它们是整数,并且它们都是指针,它们都会打印地址。地址将是相同的,因为数组的地址与其第一个元素的地址相同,即使传入的指针类型不同。
您有点滥用类型系统并传入与您告诉printf
类型不兼容的各种类型的指针。这样做的原因是因为C varargs没有经过类型检查。
答案 2 :(得分:0)
请注意,您的数组初始化会在gcc(获得版本4.2.1)下发出警告:
main.c:3: warning: missing braces around initializer
main.c:3: warning: (near initialization for ‘s[0]’)
如果你想创建一个包含2行/ 4列的数组,你可以这样做:
int s[2][4] = {{1,2,3,4}, {5,6,7,8}};
然后您可以使用printf
作为:
printf("%p,%d\n", s+1, **(s+1));
答案 3 :(得分:-1)
因为s实际上是指向指针的指针,所以如果你取消引用它,你会得到一个指针,而不是一个int。