在变量初始化上转换指向 Matrix 的指针是引用或副本

Casting a pointer to Matrix on a Variable Initialization is a Reference or a Copy

我想知道,在下面的代码中,matrix 是否只是对 pointer 上数据的引用,还是该数据的副本。在我看来,它是一个参考,但我只是想确保我是对的。

void foo(void *pointer) {

    uint8_t (*matrix)[5][5][5][5] = (uint8_t(*)[5][5][5][5])pointer;
}

代码无效。您不能使用指针初始化数组。好像有错字,函数应该是这样的

void foo(void *pointer) {
    uint8_t ( *matrix )[5][5][5][5] = (uint8_t(*)[5][5][5][5])pointer;
    // some other code
}

void * 类型的指针被解释为指向 uint8_t[5][5][5][5] 类型数组的指针。

实际上在 C 中你可以只写

void foo(void *pointer) {
    uint8_t ( *matrix )[5][5][5][5] = pointer;
    // some other code
}

这是一个演示程序(没有任何用处),显示了如何使用这种结构。

#include <stdio.h>
#include <stdint.h>
#include <string.h>

#define N   5

void foo( void *pointer ) 
{
    uint8_t ( *matrix )[N][N][N][N] = pointer;

    for ( size_t i = 0; i < N; i++ )
    {
        for ( size_t j = 0; j < N; j++ )
        {
            for ( size_t k = 0; k < N; k++ )
            {
                for ( size_t l = 0; l < N; l++ )
                {
                    ( *matrix )[i][j][k][l] = N * ( i + j + k ) + l; 
                }
            }
        }
    }
}

int main(void) 
{
    uint8_t a[N][N][N][N];

    foo( &a );

    return 0;
}