【问题标题】:Confusion in data types in a 2D array二维数组中数据类型的混淆
【发布时间】:2011-07-08 01:31:57
【问题描述】:

这是一个代码,它打印二维数组的第一个元素的地址,然后加 1。虽然所有 4 个基地址都相同,但它们加 1 显然不会给出相同的结果,因为它们不同“类型”。我可以找出一些的类型(如果它们是正确的),但不是全部。

int main()
{
    int array[4][3];
    printf("array %u\n",array);   //of type int(*)[3]
    printf("array+1 %u\n",array+1);
    printf("&array %u\n",&array);   //....???
    printf("&array+1 %u\n",&array+1);
    printf("array[0] %u\n",array[0]);    //of type int*
    printf("array[0]+1 %u\n",array[0]+1);
    printf("&array[0] %u\n",&array[0]); //....???
    printf("&array[0]+1 %u\n",&array[0]+1);
} 

能否详细解释每个基地址的“类型”,以便了解加1后涉及的指针运算。下面给出gcc机器的示例输出以供快速参考。

array       3214383040 
array+1     3214383052 
&array      3214383040 
&array+1    3214383088 
array[0]    3214383040 
array[0]+1  3214383044 
&array[0]   3214383040 
&array[0]+1 3214383052 

【问题讨论】:

    标签: c pointers


    【解决方案1】:

    拥有int array[4][3]; 以下适用

    array 是一个包含 4 个元素的数组。每个元素都是一个包含 3 个ints 的数组。在大多数情况下,单独使用名称会使数组衰减为指向其第一个元素的指针;然后array 成为指向 3 个数组的指针 ints

    array + 1 是一个指向 3 个整数数组的指针。这里array 衰减为指针,1 指的是 3 个数组 int

    &array 是整个数组的地址。它指向 4 个 3 个整数数组的数组类型的对象

    &array + 1pseudo-由 4 个 3 个整数组成的数组的数组的第二个(实际上不存在)元素

    array[0] 是一个由 3 个整数组成的数组。它通常衰减为指向第一个元素的指针

    array[0] + 1 指向array[0] 中的第二个int

    &array[0] 3 个整数数组类型对象的地址

    &array[0]+1 3 个整数数组的第二个元素

    PS。午饭后我会试着画一张(ASCII)。


    嗯...绘图很难:)

    在尝试之前,我想我可以画出更好的画。 这是我能想到的最好的...

    整数数组[4][3] ........[aaabbbcccddd]........ 其中 aaa, bbb, ccc, ddd 是 3 个整数的数组 [] 代表对象本身; {} 表示指针。 数组(对象)........[AAABBBCCCDDD]........ int[4][3] 数组(衰减)==> ........{aaa}bbbcccddd........ int(*)[3] 数组 + 1 ==> ........aaa{bbb}cccddd........ int(*)[3] &array ==> ........{aaabbbcccddd}........ int(*)[4][3] &array + 1 ==> ........aaabbbcccddd{xxxxxxxxxxxx}........ int(*)[4][3] 数组[0](对象)........[AAA]bbbcccddd........ int[3] 数组[0](衰减)==> ........{a}aabbbcccddd........ int* 数组[0] + 1 ==> ........a{a}abbbcccddd........ int* &array[0] ==> ........{aaa}bbbcccddd........ int(*)[3] &array[0] + 1 ==> ........aaa{bbb}cccddd........ int(*)[3]

    【讨论】:

    • 我对您的回答很满意,但如果您能补充图纸,那就太好了。在接受之前会等待一段时间。
    • 很好的解释!谢谢!
    【解决方案2】:

    如果将其编译为 C++,则可以使用 typeinfo STL 库中的 typeid 运算符来获取此信息。例如,运行这个

    #include <stdio.h>
    #include <typeinfo>
    
    void main()
    {
         int array[4][3];
         printf("array %s\n",typeid(array).name());   //of type int(*)[3]
         printf("array+1 %s\n",typeid(array+1).name());
         printf("&array %s\n",typeid(&array).name());   //....???
         printf("&array+1 %s\n",typeid(&array+1).name());
         printf("array[0] %s\n",typeid(array[0]).name());    //of type int*
         printf("array[0]+1 %s\n",typeid(array[0]+1).name());
         printf("&array[0] %s\n",typeid(&array[0]).name()); //....???
         printf("&array[0]+1 %s\n",typeid(&array[0]+1).name());
    }  
    

    给我以下结果

    array int [4][3]
    array+1 int (*)[3]
    &array int (*)[4][3]
    &array+1 int (*)[4][3]
    array[0] int [3]
    array[0]+1 int *
    &array[0] int (*)[3]
    &array[0]+1 int (*)[3]
    

    这就解释了为什么加 1 可以使指针增加 4 个字节(单个 int)、12 个字节(int[3])或 48 个字节(int[4][3])。

    【讨论】:

    • 直接找到它的好选择。它只是从我的脑海中滑落。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    • 2011-02-01
    • 1970-01-01
    • 2023-03-24
    • 2015-08-26
    相关资源
    最近更新 更多