永发信息网

数组名取地址是二重指针吗?还不一重指针?具体的原理是什么?

答案:3  悬赏:10  手机版
解决时间 2021-02-06 16:21
void BOOTLOADER_SECTION boot_program_page (u4 page, uint8_t *buf){}

//放到这个函数的第二个参数,为什么可以是:(u1 *)&BootBuffer(即数组名取地址,再强制转换为指针)
最佳答案
数组名仅仅是“相当”于指针,而并非真的是指针,数组名是只是个常量(一个值为数组首元素地址的常量)。
而之所以有&BootBuffer,其实这里的BootBuffer的意义早已经不是当初那个数组名了,它此时代表了整个数组。

其实BootBuffer和 &BootBuffer结果都是数组的首地址,但他们的类型是不一样。
1. BootBuffer表示&BootBuffer[0],也即对数组首元素取地址,BootBuffer+1表示首地址+sizeof(元素类型)。
2. &BootBuffer虽然值为数组首元素地址,但类型为:类型 (*)[数组元素个数],所以&BootBuffer+1大小为:首地址+sizeof(BootBuffer)。

所以最后对&BootBuffer要有强制类型转换(u1 *),即转换为类型为u1的指针,保证和函数的输入参数类型一致。

PS:如果不好理解,试一下这段代码就明白了:
#include
int main()
{
int BootBuffer[10];

printf("BootBuffer:\t%p\n", BootBuffer);
printf("&BootBuffer:\t%p\n", &BootBuffer);
printf("BootBuffer+1:\t%p\n", BootBuffer+1);
printf("&BootBuffer+1:\t%p\n", &BootBuffer+1);

return 0;
}
BootBuffer+1是一个元素的内存大小(int类型,增加4),而&BootBuffer+1增加的是整个数组的内存大小(10个int类型,增加40,即十六进制0x28)。既BootBuffer和&BootBuffer的指向和&BootBuffer[0]是相同的,但性质不同!
全部回答
数组名做为参数传递时,无论是加&还是不加,其到子函数中时,都是地址值(数组首地址),具体这个地址值如何解释,可以由子函数来确定
首先,数组名取地址,它的可以进行二次*操作,从这点来看,它有点像二重指针,但是,编译器对它的解析却是跟二重指针的解析是完全不一样的。例如下面的代码: int a[2]; int ** pa = (int**)&a;如果你这样做,然后对pa进行**pa操作会发现,你悲剧了,但是**(&a)却是OK的
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
石家庄"婚纱摄影"工作室哪家是最好啊?近期打
鑫鑫铁艺不锈钢在哪里啊,我有事要去这个地方
洋甘菊可以用到普通食品中吗
【我的长征观后感】我的长征,观后感作文
成语使用正确的一项 由此导致对港元与美元"脱
芜湖安徽师范大学的自考专升本现在还招吗?招
生死狙击荣耀ak和火筒研究所会出吗?
相亲男约女生出来,请他看电影吃哈根达斯。女
爱尚艺广告我想知道这个在什么地方
Gmail和Hotmail各有什么特色,哪个好用?
从郑州骑自行车到云南大理,该怎样走?走那一
(20分)阅读下列材料,回答相关问题:材料一 1
话说,古剑为什么不设置一个难度调节选项
…W Z D B Z D Z M S… z d h w y b z d w l
足信鞋业横泾连锁地址在哪,我要去那里办事
推荐资讯
新车伤到底漆,刚做的补漆又伤了怎么办?
金祥五金怎么去啊,有知道地址的么
成都三生创意室内设计有限公司这个地址在什么
晚上睡觉的时候 脖子很难受 总觉得 有人掐着
典雅壁纸窗帘地址在哪,我要去那里办事
洗下体的时候,盆里飘有白色的东西,一按就碎了
健康人医药旗舰店地址在什么地方,想过去办事
药物警戒的工作内容包括A.确定风险因素B.进行
沈阳陆军总院的肛肠科怎么样
添百味意式主题冰淇淋在什么地方啊,我要过去
大米先生文艺路口餐厅怎么去啊,有知道地址的
贾玲老公的照片。
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?