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

tam*_*nur 1 c pointers function multidimensional-array function-definition

我可以在声明数组的函数中使用指针概念访问数组。但是,我无法从另一个抛出错误的函数访问:indirection requires pointer operation ('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");
    }
}
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?任何的想法?

Lun*_*din 6

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

一般来说,从疯狂的指针算术表达式副歌,并使用读取的数组索引来代替:ptr[i + j]。虽然你的计算也是错误的,但应该是ptr[i*COL + j]


虽然以上被称为“错位的 2D 数组”并且是正确的,但有点陈旧的 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");
    }
}
Run Code Online (Sandbox Code Playgroud)