c - 在 C 中使用指针与数组

标签 c arrays pointers

以下程序的输出是什么?

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?

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

最佳答案

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

关于c - 在 C 中使用指针与数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16869498/

相关文章:

c - fork() 和 system() 调用无法正常工作

javascript - 从数组中获取数据

JavaScript - 检查一个数组是否具有与第二个数组相同的索引

更改像素的颜色而不使用C中的 'graphics.h'库

c - 取消引用指针时的竞争条件

c - 未经命令而更改的列表

c - 反转词。 (以 null 结尾的 C 字符串 char 数组)。为什么它不工作

c++ - 如何将逗号分隔的数字矩阵放入 C++ 中的动态分配数组中?

c++ - 比较运算符值 C++

javascript - 创建 javascript 对象时遇到问题