-1

我正在尝试学习 C,但我被以下代码卡住了。从我对C的基础知识中我了解到,数组名本身就是一个指向数组第一个元素的指针。并且二维数组中的元素一个接一个地存储。所以我尝试使用数组名称作为指针打印一维数组和二维数组中元素的值。但是对于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;
// }
4

4 回答 4

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],它本身就是一个数组,所以您试图:

  1. 使用格式说明符打印指针(array[j]作为数组,当传递给函数时衰减为指针),就好像它是一个整数一样%d- 调用未定义的行为同时它没有打印你真正想要它打印的内容;

  2. 越界访问数组(array只有两个元素,两者都是 type int [3],因此当您访问第 2、3、...、第 5 个元素时,您很快就会遇到未定义的行为)。

于 2013-07-28T06:58:26.160 回答
0

你应该编码

 for (int i=0; i<2; i++)
    for (int j=0; j<3; j++)
        printf("%d\t", t[i][j]);
 putc('\n');
于 2013-07-28T06:54:42.547 回答
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 的答案。

于 2013-07-28T06:58:44.843 回答
0

我认为这两种代码都行不通。

sizeof(array) = 24在这两种情况下。让我们假设array从地址开始,0x100然后不会像您期望的那样array+1给您。0x100 + 0x18 = 0x1180x100 + 0x4 = 0x104

0x18 = 24.

于 2013-07-28T07:02:11.733 回答