c - 当我将二维数组传递给函数 (tes).t 时,为什么声明 *(*(arr+1)+2) 不起作用

标签 c arrays pointers multidimensional-array

#include<stdio.h>

int test(int *x);

void main(){

    int arr[2][3], a;

    arr[1][2] = 2;
    printf("%d\n", test((int *)arr));
    printf("%d\n", *(*(arr+1)+2));
}

int test(int *prr){

    int a;
    a = *(*(prr+1)+2);
    return a;
}

上面的代码给了我以下错误:

error: invalid type argument of unary ‘*’ (have ‘int’)
  a = *( *(prr+1)+2);

   ^

但相同的声明适用于主函数:

printf("%d\n", *( *(arr+1)+2)).

另外,当我将其替换为*((arr+1*3) + 2)时,3是第二维的大小,在功能测试中,它工作了,我不明白怎么办?我真的很想知道原因。请帮忙!!!

为什么在传递给函数时需要类型转换 2D 数组,而不是 1D 数组。

我使用了 http://www.geeksforgeeks.org/pass-2d-array-parameter-c/ 的帮助,但原因并不存在。

最佳答案

main函数中,arr是一个int数组的数组。 *(*(arr+1)+2) 相当于 *(arr[1] + 2) = arr[1][2]arr[1] 是一个数组,将衰减为指向第一个元素 arr[1][0] 的指针。

在测试中,prr是一个指向int的指针。 *(prr+1)+2 相当于 *(prr[1] + 2)prr[1] 是一个int。这使得表达式 prr[1] + 2 成为 int。一元*运算符的操作数必须是指针变量。

将函数原型(prototype)更改为

int test(int x[][3]);

并进行函数调用

printf("%d\n", test(arr));

关于c - 当我将二维数组传递给函数 (tes).t 时,为什么声明 *(*(arr+1)+2) 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39184731/

相关文章:

c - 使用 Cubature C 包对复杂函数进行数值积分

C:None-Recursive函数变为递归函数

c - 使用递归查找两个数组是否有公共(public)数字

javascript - 查找所有 javascript 数组

c++ - 比较 char* 和 wchar_t* 类型的 C 字符串

C++:指向不同函数的成员函数指针数组

c - 关于c编程的内存泄漏问题

c++ - 异常 C++,我只是不明白为什么输出是这样的

将 int 转换为 void*

c - 在 RTOS 中安排帧的传输