-1

以下程序的输出是什么?

int main(void) {
    int n[3][3] = {
        2, 4, 3,
        6, 8, 5,
        3, 5, 1
    };
    int i, *ptr;
    ptr = n;
    for (i = 0; i <= 8; i++)
        printf("\n%d", *(ptr + i));
}

这里对n二维数组意味着什么?ptr 会有什么?使用带有数组的指针时我有很多困惑。

每次输出都是 4。我试图理解为什么它每次都打印 4?

任何解释都会对我有很大帮助。

4

3 回答 3

3

ptr 是“指向”“n”矩阵的第一个元素的指针。你让它这样做:

ptr = n[0];

你不能这样做:

ptr = n;

因为 'n' 是“数组”的“数组”(第一个数组存储 2、4 和 3,第二个数组存储 6、8 和 5,依此类推……)

当您声明“n”二维数组时,元素按线性顺序存储在内存中(一个整数分配一个接一个),这就是您可以使“n”指向一个元素(在这种情况下为第一个元素)的原因) 然后使其指向下一个元素(通过将 1 加到指针上,这称为“指针算术”)。

这是使程序以正确方式工作的小修正:

#include <stdio.h>

int main(void) {
    int n[3][3] = {
        2, 4, 3,
        6, 8, 5,
        3, 5, 1
    };
    int i, *ptr;
    ptr = n[0];
    for (i = 0; i <= 8; i++)
        printf("\n%d", *(ptr + i));
}

输出将是:

2 4 3 6 8 5 3 5

于 2013-06-01T06:06:57.927 回答
1

输出:

2 4 3 6 8 5 3 5 1

有序打印所有元素。数组是连续的,ptr=n;n 的分配地址;

n 给出第一行的地址或第一个元素的地址。

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

给出相同的地址。

arr[i] 与 *(arr+i) 相同

  n
  n[0] or(n+0)
  &n[0][0]
   |
   |
   v
   2    4    3    6   8   5      3  5  1 
|              |             |             |
|[0][0]        |             |             |
|--row 0-------| row 1       |----row 2----|            

每次执行 ptr+i 时,它的指针运算都会将 sizeof(int) 添加到 ptr 导致内存中的下一个元素。

于 2013-06-01T05:52:58.717 回答
0

ptr=n;会将 的起始地址分配给2D array n指针变量ptr。为了避免警告分配ptr = &n[0][0];。尽管 n 和 &n[0][0] 都给你相同的地址,但它们的类型是不同的。n是 的起始地址,2D array n并且&n[0][0]是数组的第一个元素的地址n[0][0]

下面修改后的程序会告诉你区别,

int main()
{
    int n[3][3] = {2, 4, 3, 6, 8, 5, 3, 5, 1};
    int i, *ptr1, (*ptr2)[3];
    ptr1 = &n[0][0];
    ptr2=n;
    printf("\n%p",ptr1);
    printf("\n%p",ptr2);
    printf("\n%p",++ptr1);
    printf("\n%p",++ptr2);
}

最初两者都ptr1ptr2打印相同的地址。但是在递增之后ptr1ptr2指向不同的地址,因为它们的类型不同。

于 2013-06-01T05:54:05.370 回答