void BOOTLOADER_SECTION boot_program_page (u4 page, uint8_t *buf){}
//放到这个函数的第二个参数,为什么可以是:(u1 *)&BootBuffer(即数组名取地址,再强制转换为指针)
数组名取地址是二重指针吗?还不一重指针?具体的原理是什么?
答案:3 悬赏:10 手机版
解决时间 2021-02-06 16:21
- 提问者网友:精神病院里
- 2021-02-06 11:09
最佳答案
- 五星知识达人网友:狂恋
- 2021-02-06 12:40
数组名仅仅是“相当”于指针,而并非真的是指针,数组名是只是个常量(一个值为数组首元素地址的常量)。
而之所以有&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]是相同的,但性质不同!
而之所以有&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]是相同的,但性质不同!
全部回答
- 1楼网友:想偏头吻你
- 2021-02-06 14:29
数组名做为参数传递时,无论是加&还是不加,其到子函数中时,都是地址值(数组首地址),具体这个地址值如何解释,可以由子函数来确定
- 2楼网友:duile
- 2021-02-06 12:59
首先,数组名取地址,它的可以进行二次*操作,从这点来看,它有点像二重指针,但是,编译器对它的解析却是跟二重指针的解析是完全不一样的。例如下面的代码:
int a[2];
int ** pa = (int**)&a;如果你这样做,然后对pa进行**pa操作会发现,你悲剧了,但是**(&a)却是OK的
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯