2D阵列中数据类型的混淆

@H_404_1@这是一个代码,用于打印2D数组的第一个元素的地址,然后添加1.尽管所有4个基址都相同,但由于它们的“类型”不同,它们的加法显然不会给出相同的结果.我可以找出一些类型(如果它们是正确的)但不是全部.
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

解决方法

有int数组[4] [3];以下适用

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

数组1是指向3个int的数组的指针.这里数组衰减到指针,1指向3 int的数组

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

& array 1是4个3个数组的数组的伪数组的第2个(实际上不存在)元素

array [0]是一个3个整数的数组.它通常衰减到指向第一个元素的指针

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

& array [0]类型为3 int的数组对象的地址

& array [0] 1 3个int数组的第2个元素

PS.午饭后我会尝试画一幅画(ASCII).

嗯……画很难:)

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


    int array[4][3]        ........[aaabbbcccddd]........
                              where aaa,bbb,ccc,ddd are arrays of 3 ints'

    the [] represent the object itself; the {} represent pointers.

    array (object)         ........[AAABBBCCCDDD]........       int[4][3]
    array (decayed)    ==> ........{aaa}bbbcccddd........       int(*)[3]

    array + 1          ==> ........aaa{bbb}cccddd........       int(*)[3]

    &array             ==> ........{aaabbbcccddd}........       int(*)[4][3]
    &array + 1         ==> ........aaabbbcccddd{xxxxxxxxxxxx}........       int(*)[4][3]

    array[0] (object)      ........[AAA]bbbcccddd........       int[3]
    array[0] (decayed) ==> ........{a}aabbbcccddd........       int*

    array[0] + 1       ==> ........a{a}abbbcccddd........       int*

    &array[0]          ==> ........{aaa}bbbcccddd........       int(*)[3]
    &array[0] + 1      ==> ........aaa{bbb}cccddd........       int(*)[3]

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...