我正在尝试制作2d数组,将其传递给函数,然后在main中更新修改后的数组

时间:2011-09-06 21:58:18

标签: c pointers types segmentation-fault

编译器显示:

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]);
}

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的数组的指针。