c中的二维数组和指针

时间:2013-05-22 20:25:29

标签: c arrays pointers

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?

4 个答案:

答案 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。