【问题标题】:Access 2D array from another function in C从 C 中的另一个函数访问二维数组
【发布时间】:2021-08-28 07:49:22
【问题描述】:

我可以在声明数组的函数中使用指针概念访问数组。但是,我无法从另一个引发错误的函数访问:间接需要指针操作数('int' 无效)。代码是:

#include <stdio.h>

const int ROW = 3;
const int COL = 3;

void printArray(int *ptr);

int main(void)
{
    int arr[ROW][COL];
    int count = 2;

    // initialize 2D array
    for (int i = 0; i < ROW; i++)
    {
        for (int j = 0; j < COL; j++)
        {
            arr[i][j] = count++;
        }
    }

    // print 2D array
    for (int i = 0; i < ROW; i++)
    {
        for (int j = 0; j < COL; j++)
        {
            // printf("%i\t", arr[i][j]); // using array
            printf("%i\t", *(*(arr + i) + j)); // using pointer

        }
        printf("\n");
    }

    printf("\n---------printing using function------------\n");
    printArray(&arr[0][0]);
}

void printArray(int *ptr)
{
    for (int i = 0; i < ROW; i++)
    {
        for (int j = 0; j < COL; j++)
        {
            printf("%i\t", *(*(ptr + i) + j)); // not working as expected
        }
        printf("\n");
    }
}

我该如何解决这个问题?有什么想法吗?

【问题讨论】:

    标签: c function pointers multidimensional-array function-definition


    【解决方案1】:

    对于初学者,请注意 C 中的这些声明

    const int ROW = 3;
    const int COL = 3;
    

    不要声明整数常量。所以你的程序处理一个可变长度的数组。

    如果你想定义整数常量,你可以这样写

    enum { ROW = 3, COL = 3 };
    

    尽管如此,还是通过以下方式声明和定义函数

    void printArray( int ( *ptr )[COL], int row );
    

    void printArray( int ( *ptr )[COL], int row )
    {
        for (int i = 0; i < row; i++)
        {
            for (int j = 0; j < COL; j++)
            {
                printf("%i\t", *(*(ptr + i) + j));
            }
            printf("\n");
        }
    }
    

    然后这样称呼它

    printArray( arr, ROW );
    

    或者如果使用您的声明,那么函数定义将如下所示

    void printArray(int *ptr)
    {
        for (int i = 0; i < ROW; i++)
        {
            for (int j = 0; j < COL; j++)
            {
                printf("%i\t", *( ptr + i * COL + j ) );
            }
            printf("\n");
        }
    }
    

    【讨论】:

      【解决方案2】:

      *(*(ptr + i) + j) 使用两级间接取消引用指针,这是不可能的,因为它只有一个,即 int*

      一般来说,不要使用疯狂的指针算术表达式,而是使用可读的数组索引:ptr[i + j]。虽然你的计算也是错误的,但应该是ptr[i*COL + j]


      虽然上面被称为“损坏的二维数组”并且是正确的但有点过时的 C。通过使用指向可变长度数组 (VLA) 的指针,就像在现代 C 编程中所做的那样,我们可以使代码更具可读性:

      #include <stdio.h>
      
      const int ROW = 3;
      const int COL = 3;
      
      void printArray(size_t row, size_t col, int array[row][col]);
      
      int main(void)
      {
          int arr[ROW][COL];
          int count = 2;
      
          // initialize 2D array
          for (int i = 0; i < ROW; i++)
          {
              for (int j = 0; j < COL; j++)
              {
                  arr[i][j] = count++;
              }
          }
      
          // print 2D array
          for (int i = 0; i < ROW; i++)
          {
              for (int j = 0; j < COL; j++)
              {
                  // printf("%i\t", arr[i][j]); // using array
                  printf("%i\t", *(*(arr + i) + j)); // using pointer
      
              }
              printf("\n");
          }
      
          printf("\n---------printing using function------------\n");
          printArray(ROW, COL, arr);
      }
      
      void printArray(size_t row, size_t col, int array[row][col])
      {
          for (size_t i = 0; i < row; i++)
          {
              for (size_t j = 0; j < col; j++)
              {
                  printf("%i\t", array[i][j]);
              }
              printf("\n");
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-07
        • 2011-05-22
        • 2016-08-26
        • 1970-01-01
        • 2013-06-29
        • 2022-01-25
        • 2017-04-03
        相关资源
        最近更新 更多