#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]);
答案 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
数组的指针,这正是你的函数所需要的
我故意不接触数组大小的问题。