将2d数组作为指针C传递

时间:2014-01-23 20:12:37

标签: c pointers

所以我有一个递归函数,要求它是void类型,而不转向全局变量如何在递归函数中编辑值时如何将二维数组作为指针传递并取消引用?我已经尝试过int * m [10] [10],我无法显示所有代码,因为它是一个赋值,在赋值中不需要指针但是不允许全局变量

Void h(int * m[10][10]){
    int x = 5;
    int y = 5;
    *m[x][y]=7;
}

这是一般的想法

3 个答案:

答案 0 :(得分:1)

只需尝试这个

Void h(int  m[][10]) {
    ...

    m[x][y]=7;
}  

将您的功能调用为

h(&m[0]);   // Passing the address of first row of 2D array m.  

h(m);       // As array names decays to pointer to first element of the array. Note that 
            // m will decays to pointer to m[0], not m[0][0].

答案 1 :(得分:1)

这完全取决于你声明数组应该如何传递给你的函数。

如果你宣布它是这样的

int my_array[10][10];     // array declaration

然后

void fun (int m[10][10]); // prototype of a function accepting my_array
fun (my_array);           // calling the function

正是您要找的。

在这种情况下,m是指向100个连续int 常量 指针,可作为10x10 2D数组访问。

其他可能的变体:

int * my_array[10];
for (i = 0 ; i != 10 ; i++) my_array[i] = malloc (10*sizeof(int));

void fun (int m[10][]); // these syntaxes are equivalent
void fun (int * m[10]);

或者这个:

int ** my_array;
my_array = malloc (10 * sizeof (int*));
for (i = 0 ; i != 10 ; i++) my_array[i] = malloc (10*sizeof(int));

void fun (int m[][]); // these syntaxes are equivalent
void fun (int * m[]);
void fun (int **  m);

或这种病态的:

int (* my_array)[10];
int a0[10];
int a1[10];
/* ... */
int a9[10];
my_array = malloc (10 * sizeof (int *));
my_array[0] = a0;
my_array[1] = a1;
/* ... */
my_array[9] = a9;

void fun (int m[][10]); // these syntaxes are equivalent
void fun (int (* m)[10]);

如果变量声明和函数原型不一致,则不会从函数内正确访问数组,读取不连贯的值,搞乱内存,如果尝试修改元素,可能会崩溃。

如果您没有更好的事情,可以阅读this little essay of mine on the subject了解更多详情。

答案 2 :(得分:-1)

void h(int** m) {
    int x = 5;
    int y = 7;
    m[x][y] = 7;
}

int main(int argc, char* argv[])
{
    int** a = (int **)malloc(10*sizeof(int *));

    for (int i=0; i<10; i++) {
        a[i] = (int *)malloc(10*sizeof(int));
    }

    h(a);

    return 0;
}