我正在努力学习C语言,但我对以下一段代码感到困惑。我从C的基本知识中理解的是,数组名称本身是一个指向数组第一个元素的指针。并且2D数组中的元素一个接一个地存储。所以我尝试使用数组名称作为指针来打印一维数组和二维数组中的元素值。但是对于Code 1
它正如我预期的那样工作。但是Code 2
给出了意想不到的结果(它给出了每行的起始地址)。这是怎么发生的?我觉得我的理解有些不对劲。任何人都可以澄清错误。
// Code 1
//-------
#include <stdio.h>
int main () {
int array[2][3] = {{5, 7, 9}, {2, 5, 77}};
int j;
for (j=0; j < 6; j++)
printf("%d\t", *(array+j));
return 0;
}
//Code 2
//------
// #include <stdio.h>
// int main () {
// int array[6] = {5, 7, 9, 2, 5, 77};
// int j;
// for (j=0; j < 6; j++)
// printf("%d\t", *(array+j));
// return 0;
// }
答案 0 :(得分:2)
由于多维数组在内存中是连续的,你可以抓住指向数组第一个元素的指针并使用它,就像它指向一维数组的第一个元素一样:
int array[2][3] = { { 5, 7, 9 }, { 2, 5, 77 } };
int *p = &array[0][0];
for (int i = 0; i < 6; i++)
printf("%d\n", p[i]);
您的原始尝试*(array+j)
错误,因为它等同于array[j]
,这是一个数组本身,所以您试图:
打印一个指针(array[j]
,作为一个数组,在传递给函数时衰减成指针),好像它是一个整数,使用%d
格式说明符 - 调用undefined行为和同时它不打印您真正想要打印的内容;
访问数组越界(array
只有两个元素,都是int [3]
类型,所以当你访问第2,第3,...时,你会很快遇到未定义的行为。 。,第5个元素)。
答案 1 :(得分:0)
你应该编码
for (int i=0; i<2; i++)
for (int j=0; j<3; j++)
printf("%d\t", t[i][j]);
putc('\n');
答案 2 :(得分:0)
对于二维数组,您的代码无效。变化
int j;
for (j=0; j < 6; j++)
printf("%d\t", *(array+j));
到
for (int i=0; i<2; i++)
for (int j=0; j<3; j++)
printf("%d\t", *(*(array+i)+j));
对于指针版本,请参阅@ H2CO3的答案。
答案 3 :(得分:0)
我认为这两种代码都不起作用。
两种情况下都是 sizeof(array) = 24
。假设array
从地址0x100
开始,然后array+1
将为您0x100 + 0x18 = 0x118
提供0x100 + 0x4 = 0x104
,而不是您所期望的。
0x18 = 24
。