【问题标题】:How to pass a 2d array through pointer in c [duplicate]如何通过c中的指针传递二维数组[重复]
【发布时间】:2012-12-23 15:08:47
【问题描述】:

可能重复:
Passing a pointer representing a 2D array to a function in C++

我正在尝试通过指针将我的二维数组传递给一个函数并想要修改这些值。

#include <stdio.h>

void func(int **ptr);

int main() {
    int array[2][2] = {
        {2, 5}, {3, 6}
    };

    func(array);

    printf("%d", array[0][0]);
    getch();
}

void func(int **ptr) {
    int i, j;
    for (i = 0; i < 2; i++) {
        for (j = 0; j < 2; j++) {
            ptr[i][j] = 8;
        }
    }
}

但是程序会因此而崩溃。我做错了什么?

【问题讨论】:

  • 使用正确的类型,void func(int (*ptr)[2]),或者传递一个指针数组。
  • 数组不是指针。指针不是数组。你做错了什么是在你不再怀疑之前没有对自己重复这件事。

标签: c++ c pointers


【解决方案1】:

您的数组的类型为int[2][2](“2 个整数数组的数组”),其名称将衰减为指向其第一个元素的指针,该指针的类型为int(*)[2](“指向2 个整数数组的指针”) ”)。所以你的func 需要接受这种类型的参数:

void func(int (*ptr)[2]);
// equivalently:
// void func(int ptr[][2]);

或者,您可以引用数组类型(“reference to array of 2 array of 2 int”):

void func(int (&ptr)[2][2]);

确保同时更改声明和定义。

【讨论】:

    【解决方案2】:

    它崩溃是因为数组不是指向指针的指针,它会尝试读取数组值,就好像它们是指针一样,但是数组只包含没有任何指针的数据。
    数组在内存中都是相邻的,调用函数时只接受一个指针并进行强制转换:

    func((int*)array);
    

    ...

    void func(int *ptr) {
        int i, j;
        for (i = 0; i < 2; i++) {
            for (j = 0; j < 2; j++) {
                ptr[i+j*2]=8;
            }
        }
    }
    

    【讨论】:

    • 谢谢。你让我今天一整天都感觉很好。但是如果我想在数组中存储不同的东西,如何设置 i 和 j 呢??
    • 我没明白你的意思。
    猜你喜欢
    • 2013-05-19
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    相关资源
    最近更新 更多