在变量初始化上转换指向 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;
}
我想知道,在下面的代码中,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;
}