C 中多维数组的间接寻址

Indirection in C with Multidimensional Arrays

我想执行类似于以下代码的操作,但我不断收到有关间接级别的警告。

以下是我的理解,

int Array1[5];
int Array2[2][4];
int *pointer1 = Array1;
int *pointer2 = Array2;

所有 4 个示例都具有 (int*) 的间接级别。

但似乎无论我尝试以何种方式组合以下想法来编译代码,我都会收到间接警告:

void loadIntArrayData(int size, int *buffer);

void passArrayIntoThisFunction(char count, int *structure){     //idea 1
void passArrayIntoThisFunction(char count, int **structure){    //idea 2
void passArrayIntoThisFunction(char count, int structure[][3]){ //idea 3
    loadIntArrayData(3*count*sizeof(int), structure);          //idea 1
    loadIntArrayData(3*count*sizeof(int), &(structure[0][0])); //idea 2
    loadIntArrayData(3*count*sizeof(int), &(structure[0]));    //idea 3
    loadIntArrayData(3*count*sizeof(int), structure[0]);       //idea 4
}

int main(void){
    passArrayIntoThisFunction(2, (int[][3]){{1,2,3},{4,5,6}});
    //I want to have a multi-level array ^ here ^ for readability
    return 0;
}

有人可以解释一下多维数组的间接级别吗?

这里是警告(小的变化取决于使用的组合):

'function': 'int *' differs in levels of indirection from 'int[2][3]'

如果你有一个像这样的数组

int Array2[2][4];

当在表达式中使用时(除了极少数例外),特别是作为初始值设定项时,它会转换为指向其第一个元素的指针。数组元素的类型为 int[4]。因此,指向数组第一个元素的指针的类型为 int( * )[4]

因此你可以这样写

int Array2[2][4];

int ( *pointer2 )[4] = Array2;

至于这个函数声明

void passArrayIntoThisFunction(char count, int structure[][3]);

及其调用

passArrayIntoThisFunction(2, (int[][3]){{1,2,3},{4,5,6}});

然后用作参数的复合文字具有类型 int ( * )[3] 并且相应的函数参数被编译器调整为 int ( *structure )[3].

因此,如果您想将此指针进一步传递给另一个函数,则该函数的相应参数必须具有相同的类型,或者它可以具有类型 int * 但在这种情况下,您必须明确地进行强制转换传递的指向类型 int *.

的指针

在 C 中,数组的名称在所有情况下都会衰减到其第一个元素的指针,但以下三种情况除外:使用 &(寻址)运算符,使用 sizeof运算符和文字字符串初始化(例如 char a[] = "foobar";

因此,在 int *pointer2 = Array2; 中,您的 Array2 衰减为 int (*)[](指向数组的指针)而不是 int *