编译器显示:
Warning: passing argument 1 of 'fun' from incompatible
pointer type; note: expected 'int ()[5]' but argument
is of type 'int (*)[5][5]'
代码:
#include<stdio.h>
void fun(int * b[][5])
{
int x=11,y=90;
printf("here");
*b[1][3] = x;
*b[3][1] = y;
*b[2][2] = x + ++y;
}
int main()
{
int a[5][5];
a[1][3] = 12;
a[3][1] = 145;
fun(&a);
printf("%d %d %d",a[1][3],a[3][1],a[2][2]);
}
答案 0 :(得分:3)
您的函数参数中不需要星号,也不需要在函数中取消引用数组b。数组通过引用传递(因此也要删除foo(&amp; a)中的&符号),因为C将它们视为指向序列中第一个元素的指针。
多维数组被视为指向较小子数组起始点的指针数组,即数组数组。与上述相同的解释适用。
您的代码最终应该如下所示:
void fun(int b[][5]) // can also be (int (*b)[5]), i.e. array of 5 pointers
{
int x=11,y=90;
b[1][3] = x;
b[3][1] = y;
b[2][2] = x + ++y;
}
int main()
{ // ...
fun(a);
// ...
}
答案 1 :(得分:2)
int a[5][5]; //is an 2d int array
当数组传递给函数时,真正传递的是指向数组第一个元素的指针。
所以用fun()
调用fun(a)
函数实际上会将指针传递给a
第一个元素,在本例中是一个大小为5的int数组。函数fun()
将收到一个指向大小为5的int数组的指针,即int (*b)[5]
。请注意int *b[5]
不一样,是一个大小为5的数组,包含int指针。
您的fun
功能可以包含:
void fun(int b[][5])
或
void fun(int (*b)[5])
第一种方法是说函数将接收一个2d的int数组,但是因为我们知道实际发送给函数的是指向数组a
的第一个元素的指针,编译器将静静地编译该函数,就像参数是一个指针一样,因为它是一个指针,它将接收。
第二种方法是显式地显示它将接收的类型,指向大小为5的数组的指针。