警告传递给函数的二维数组中的不兼容指针类型

时间:2017-05-14 17:36:22

标签: c

#include<stdio.h>

void fun(int r,int x,int arr[][x]);

void main()
{
 int arr[][3]={1,2,3,4,5,6,7,8,9};
 fun(3,3,&arr[0][0]);  
}

void fun(int r,int x,int arr[][x])
{
 int i=0,j=0;
 printf("%d",*(*(arr+i)+j));
}

编译器输出:

warning: passing argument 3 of ‘fun’ from incompatible pointer type [-Wincompatible-pointer-types]
  fun(3,3,&arr[0][0]);
          ^
1.c:2:6: note: expected ‘int (*)[(sizetype)(x)]’ but argument is of type ‘int *’
 void fun(int r,int x,int arr[][x]);        

1 个答案:

答案 0 :(得分:1)

arr是一个int数组的数组(它会立即转换为指向int数组的指针;查找&#34;数组到指针衰减&#34;如果你是不知道为什么会这样)。

arr[0]int的数组(会立即转换为指向int的指针)。

arr[0][0]int

&arr[0][0]是指向int的指针。

你的函数需要一个指向int数组的指针(你可以使用int数组的数组,正如我们已经知道的那样,它会立即转换为指向{的数组的指针{1}},这正是你的功能所需要的)。 (参数类型写为int,即int arr[][x]数组的数组,但它是一个欺骗。它是指向int数组的指针。 up&#34;参数类型调整&#34;如果您不确定为什么会这样)。

指向int的指针与指向int数组的指针不同,这就是编译器抱怨的原因。

幸运的是,你已经拥有int,它是一个arr数组的数组,它会立即转换为指向int数组的指针,这正是你的函数所需要的

我故意不接触数组大小的问题。