【问题标题】:Indirection in C with Multidimensional ArraysC语言中的间接多维数组
【发布时间】:2020-09-29 01:45:28
【问题描述】:

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

据我了解,在下文中,

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]'

【问题讨论】:

  • 指针类型不匹配。在消除所有代码之前,甚至不要尝试运行代码。对pointer2 的分配应该会产生一个不兼容的指针警告,因为您正试图将int (*)[4] 分配给int *。如果要正确声明pointer2,则声明为int (*pointer2)[4];,然后可以通过pointer2正确访问Array2

标签: c arrays multidimensional-array implicit-conversion


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    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 *

    【讨论】:

    • 谢谢。您关于从数组指针显式转换的信息很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    相关资源
    最近更新 更多