如何通过c中的指针传递二维数组[重复]

Posted

技术标签:

【中文标题】如何通过c中的指针传递二维数组[重复]【英文标题】:How to pass a 2d array through pointer in c [duplicate] 【发布时间】: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]),或者传递一个指针数组。 How do I use arrays in C++? 数组不是指针。指针不是数组。你做错了什么是在你不再怀疑之前没有对自己重复这件事。 【参考方案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 呢?? 我没明白你的意思。

以上是关于如何通过c中的指针传递二维数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

无法使用双指针作为函数参数传递二维数组[重复]

C语言中 指针做函数参数传递二维数组

数组参数和指针参数

C语言二维数组问题

C语言函数传递二维数组

C语言中如何将二维字符数组作为函数参数引用传递