为什么我的2D阵列无法正常工作?

时间:2014-08-22 07:07:48

标签: c arrays pointers

我是C编程的新手。我想打印2,因为我的第一个元素是2D数组中的2。但是我知道n保存数组的第一个地址所以* n应该打印第一个元素是2我的代码

‪#‎include‬ <stdio.h>
int main()
{
int n[3][3]={2,4,3,6,8,5,3,5,1};
printf("%d\n",*n);
return 0;
}

为什么要打印一个地址。任何人都可以向我解释一下吗?

5 个答案:

答案 0 :(得分:1)

你需要像这样声明你的数组:

int n[3][3]={{2,4,3},{6,8,5},{3,5,1}};

请注意,第一个[3]不是必需的(但指定它没有任何问题)。顺便说一句,如果您启用警告,例如使用gcc -Wall,编译器会警告初始化程序中缺少大括号。

然后打印您可以使用的第一个值:

printf("%d\n",n[0][0]);

或者,如果您愿意:

printf("%d\n",*n[0]);

你有一个或多个数组,所以这需要第0个元素(它是一个数组),然后取消引用它以得到第0个值。

答案 1 :(得分:1)

2d数组只是一个数组数组,因此*n实际上是第一个子数组,用于打印第一个子数组的第一个元素:

printf("%d\n", **n);

或者这更简单,更清晰:

printf("%d\n", n[0][0]);

答案 2 :(得分:1)

我认为您在%d上收到了一些警告,因为您没有尝试打印该值 - 仅限地址。

对于2D数组,要获取任何值,您需要取消引用两次。即**n*n也适合,但对于一维数组。

您可以在此处使用**n*n[0]n[0][0]代替*n

答案 3 :(得分:0)

如果n是一个整数数组,*n会打印第一个整数,正如您所期望的那样。

但是n不是那样的。是一个二维数组。查看它的一种方法是:一组数组。所以实际上*n是一个数组。

答案 4 :(得分:0)

如果您有一维数组 -

int n[9]={2,4,3,6,8,5,3,5,1};
 printf("%d\n",*n);

因为如果你取消引用1D数组,它将获取元素。现在它将打印2。 但

int n[3][3]={2,4,3,6,8,5,3,5,1};

这是一个二维数组,所以你需要两次dererence。如果你有一次取消它只会获取数组的地址。 nn[0]*n&n&n[0]都代表它的起始地址。

尝试 -

printf("%d\n",**n);

printf("%d\n",n[0][0]);