c - 将指针的二维数组传递给函数 C 的不同方法

标签 c arrays function pointers 2d

今天在将二维数组传递给函数时遇到了一些问题,后来我找到了一些解决方案,例如A和B。 我知道二维数组作为一维存储在连续内存中。所以在我看来,实际上不存在二维点,编译器将这些连续的数字分开并提出了“二维”概念。

我的问题是:在 C 中,我明确告诉编译器参数是“int**”后,为什么它没有传递“二维”点?

有人可能会指出“在 C 中你没有告诉编译器组长度”,我认为它知道这个信息,因为如果你尝试将 12 个元素的普通内存重新解释为 arr[2][6] 它将是类似“void printArr(int _arr[][6], int _columns, int _rows)”的错误。

有点困惑,请帮忙...

int arr[][3]={{1,2,3},{5,6,7},{9,10,11},{13,14,15}};

void printArr(int _arr[][3], int _columns, int _rows){ //----->A
void printArr(int (* _arr)[3], int _columns, int _rows){//---->B
void printArr(int** _arr, int _columns, int _rows){//--------->C
    for(int r=0; r< _rows; r++){
        for (int c=0; c<_columns; c++)
            //printf("%4d,", _arr[r][c]);
            printf("%4d,", *(*(_arr+r)+c));
    }   
}
int main(){
    printArr(arr, columns, rows);
}

最佳答案

数组会衰减为指针,这意味着如果您有一个数组数组 int arr[x][y] 它可以衰减为指向数组的指针 int (*arr)[y ]

int ** arr 因此将是退化指针数组 int *arr[x] 的一个版本,它是与您的数组不兼容的类型。

关于c - 将指针的二维数组传递给函数 C 的不同方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4440248/

相关文章:

c - 如何使用 gcov 进行测试覆盖率(使用 perl 脚本测试 C 程序)?

c++ - 将 C Flex 词法分析器链接到 C++ 解析器

java - 循环浏览窗口中的颜色

python - 具有默认参数的函数出现问题

javascript - IIFE 运行函数声明和函数表达式,结果不同

c++ - 管理二维 CUDA 阵列

c - 使用 C 修改从索引开始的数组内容

java - ArrayList 作为对象属性不保存值

c++ - 就常量性和引用性而言,函数应该如何接受 *lambda* 参数?

c - 有符号除数的 % 运算符在 C 中需要更多的程序内存