在C中通过指针传递二维数组



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

我得到一个invalid type argument of type unary *错误在这个语句printf("Arr[%d][%d] is %dn",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 %dn",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 %dn",i,j,*(*(q+i)+j));
        }
}

解决这个问题的另一种方法是显式传递数组的地址并取消引用(display()),但是也可以实现所需的结果,而无需额外的间接级别(display1()):

#include <stdio.h>
void display(const size_t row, const size_t col, int (*pa)[row][col]);
void display1(const size_t row, const size_t col, int a[row][col]);
int main(void)
{
  int a[3][4] = {
    {  1,  2,  3,  4 },
    {  5,  6,  7,  8 },
    {  9, 10, 11, 12 } 
  };
  display(3, 4, &a);
  display1(3, 4, a);
  return 0;
}
void display(const size_t rows, const size_t cols, const int (*pa)[row][col]);
{
  for (size_t i = 0; i < rows; ++i)
  {
    for (size_t j = 0; j < cols; ++j)
    {
      printf("Arr[%zu][%zu] is %dn", i, j, (*pa)[i][j]);
    }
  }
}
void display1(const size_t rows, const size_t cols, const int a[row][col]);
{
  for (size_t i = 0; i < rows; ++i)
  {
    for (size_t j = 0; j < cols; ++j)
    {
      printf("Arr[%zu][%zu] is %dn", i, j, a[i][j]);
    }
  }
}

Update:这至少需要一个C99兼容的编译器

在现代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 %dn", i, j, q[i][j]);
        }
}

一般来说,要将2D数组传递给函数,您需要指定除第一个维度之外的所有数组的维度,因此在本例中,您需要将[4]用于最后一个维度,但您可以选择省略它用于第一个维度,即

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

并作如下声明

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

你唯一的问题是你调用display的方式。您需要在传递数组时删除索引,并修复display的初始定义以匹配:

#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 %dn",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

相关内容

  • 没有找到相关文章