2D数组通过C中的指针传递

时间:2014-06-09 07:02:34

标签: c arrays function pointers multidimensional-array

下面是我的代码,我将名为a的数组传递给显示函数,该函数只显示数组。

我在此声明invalid type argument of type unary *

上收到printf("Arr[%d][%d] is %d\n",i,j,*(*(q+i)+j));错误

但是,注释代码会正确打印值。你能解释一下我做错了什么吗?我是C的新手,请原谅我,如果这是一个愚蠢的错误/错误。

#include <stdio.h>
void display(int *, int, int);
int main()
{
    int a[3][4] = {
                            {1,2,3,4},
                            {5,6,7,8},
                            {9,10,11,12}
                            };
    display(a,3,4);
    /*
    int i,j;

    for(i=0; i<3; i++)
        {
            for(j=0; j<4; j++)
                printf("Arr[%d][%d] is %d\n",i,j,*(*(a+i)+j));
        }
    */
    return 0;
}
void display(int *q, int row, int col)
{
    int i,j;

    for(i=0; i<row; i++)
        {
            for(j=0; j<col; j++)
                printf("Arr[%d][%d] is %d\n",i,j,*(*(q+i)+j));
        }
}

4 个答案:

答案 0 :(得分:2)

解决此问题的另一种方法是显式传递数组的地址并将其取消引用(display())所需的结果,但也可以在没有额外的间接级别的情况下实现({{1 }}):

display1()

更新:这至少需要一个兼容C99的编译器。

答案 1 :(得分:1)

在现代C中,您应首先传递尺寸的尺寸

void display(size_t row, size_t col, int (*q)[col]);

然后您可以像q一样正常使用q[i][j],并为您完成所有索引计算。

void display(size_t row, size_t col, int (*q)[col]) {
    for(size_t i=0; i<row; i++) {
            for(size_t j=0; j<col; j++)
                printf("Arr[%zu][%zu] is %d\n", i, j, q[i][j]);
        }
}

这需要在leas C99上工作。

答案 2 :(得分:0)

通常,要将2D数组传递给函数,您需要为除第一个维度以外的所有维度指定数组维度,因此在此示例中,您需要[4]作为最后一个维度,但您可以选择省略第一个维度,即

void display( int (*q)[4], int row, int col)

并在上面声明如下

void display(int (*)[], int, int);

答案 3 :(得分:0)

你唯一的问题是你打电话给显示器的方式。您需要在传递数组时删除索引并修复显示的初始定义以匹配:

#include <stdio.h>

void display(int q[][4], int, int);

int main()
{
    int a[3][4] = {
                            {1,2,3,4},
                            {5,6,7,8},
                            {9,10,11,12}
                            };

    display (a, 3, 4);

    return 0;
}
void display(int q[][4], int row, int col)
{
    int i,j;

    for(i=0; i<row; i++)
        {
            for(j=0; j<col; j++)
                printf("Arr[%d][%d] is %d\n",i,j,*(*(q+i)+j));
        }
}

输出:

Arr[0][0] is 1
Arr[0][1] is 2
Arr[0][2] is 3
Arr[0][3] is 4
Arr[1][0] is 5
Arr[1][1] is 6
Arr[1][2] is 7
Arr[1][3] is 8
Arr[2][0] is 9
Arr[2][1] is 10
Arr[2][2] is 11
Arr[2][3] is 12