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

解引用3维数组

如何解决解引用3维数组

#include "stdio.h"


int main(){

int D[2][3][3] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18};


printf("D: %p\n",D);
printf("*(0x0061FEC8): %d\n",*((int *)(0x0061FEC8)));
printf("*D: %p\n",*D);

    return 0;
}

以上代码输出为:

D: 0061FEC8
*(0x0061FEC8): 1
*D: 0061FEC8

p.s:通过多次运行该代码,我获得了地址0x0061FEC8,并看到它没有变化。由于不允许取消引用整数,因此我也将其强制转换为整数指针。

好的,我从几个资料中读到,除了&和sizeof运算符这两个例外,多维数组的名称会衰减为指向该连续内存块第一个元素的指针。 因此,如果3d数组名称D衰减到指向第一个元素的指针中,为什么第二行和第三行的输出不同? D应该衰减到地址0x0061FEC8中,并取消引用该地址应我认为值1。但是,它会再次打印地址。

解决方法

当您执行*((int *)(0x0061FEC8))时,会将该位置的地址视为指向 1D 数组的第一个元素的指针。取消引用该指针时,将在该位置获得值。

但是,当您执行*D时,它与类型为D[0]的{​​{1}}相同。它将衰减为指向int [3][3]类型的D[0][0]指针。即int (*)[3]不是值。

因此,这两个表达式执行两项非常不同的操作。一个(第一个)是错误的,第二个是正确的。

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