微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

这是一个代码,用于打印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]

原文地址:https://www.jb51.cc/c/114881.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐