首页 > 解决方案 > 在 C 中为 2D 数组声明指针的最佳方法是什么?

问题描述

我似乎找不到我要找的东西。我正在学习如何在 C 中使用 2D 数组,同时也在学习指针。为 2D 数组声明指针的最佳方法是什么?

我正在这样做

    int nums[2][3] = {
            {5, 4, 3},
            {3, 0, 9}
    };
    int *numsptr = nums;
    printf("%p\n", numsptr);

另外如何通过指针访问特定索引?我读的那篇文章是这么说的。

In general, nums[i][j] is equivalent to *(*(nums+i)+j)

我试着这样做。

printf("%d\n", (*numsptr + 1) + 2);

哪些输出8(不在二维数组中)

标签: carrays

解决方案


如何通过指针访问特定索引?

取决于指针。您可以声明一个指向 3 数组的指针ints,这样您就可以像访问数组一样访问指针(但要注意sizeof):

int (*ptr)[3] = nums;
for (int i = 0; i < 2; ++i) {
    for (int j = 0; j < 3; ++j) {
       printf("[%d][%d] = %d\n", i, j, ptr[i][j]);
       // since you mentioned `a[b] == *(a + b)` some alternatives:
       // or printf("[%d][%d] = %d\n", i, j, *(*(ptr + i) + j));
       // or printf("[%d][%d] = %d\n", i, j, *(ptr[i] + j));
       // or printf("[%d][%d] = %d\n", i, j, (*(ptr + i))[j]);
       // or pls dont printf("[%d][%d] = %d\n", i, j, i[ptr][j]);
    }
}

您使用指向 2 个 3 ints 数组的数组的指针。从语义上讲,这是另一回事,您必须首先取消引用指针:

int (*var)[2][3] = &nums;
for (int i = 0; i < 2; ++i) {
    for (int j = 0; j < 3; ++j) {
        printf("[%d][%d] = %d\n", i, j, (*var)[i][j]);
    }
}

因为数组中的元素是连续放置在内存中的,所以您可以使用指向该数组的别名int并自己执行行/列算术:

int *p = (int*)nums;
for (int i = 0; i < 2 * 3; ++i) {
    printf("[%d] = %d\n", i, p[i]);
}
for (int i = 0; i < 2; ++i) {
    for (int j = 0; j < 3; ++j) {
        printf("[%d][%d] = %d\n", i, j, p[i * 3 + j]);
    }
}

推荐阅读