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 *
。
我想执行类似于以下代码的操作,但我不断收到有关间接级别的警告。
以下是我的理解,
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 *
。