从 C 中的另一个函数访问二维数组

Access 2D array from another function in C

我可以在声明数组的函数中使用指针概念访问数组。但是,我无法从另一个引发错误的函数进行访问:indirection requires pointer operand ('int' invalid)。代码是:

#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");
    }
}

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

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

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


虽然上面提到的是“损坏的二维数组”并且是正确的,但是有点陈旧的 C。通过使用现代 C 编程中所做的可变长度数组 (VLA) 的指针,我们可以大大改变代码更具可读性:

#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");
    }
}

对于初学者,请注意 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");
    }
}