void BOOTLOADER_SECTION boot_program_page (u4 page, uint8_t *buf){}
//放到这个函数的第二个参数,为什么可以是:(u1 *)&BootBuffer(即数组名取地址,再强制转换为指针)
那(u1 *)&BootBuffer这样可以当成,一个指向数组首地址的指针变量用吗?(也就是可以当成一个指针变量用?)还是,BootBuffer与&BootBuffer一样的,只有++时有差别?
追答可以当做一个指向数组首地址(且数组元素类型是u1)的指针变量用
追问那当作参数传递给uint8_t *buf之后,再uint8_t w = *buf++; w等于首元素值?
追答如果u1和uint8_t的定义一样,那么这样调用并在函数中这样赋值后w是首元素值。我建议有不明白的可以把这部分程序拷出来,单独后在程序中加输出语句试一下,实践出真知。
首先,数组名取地址,它的可以进行二次*操作,从这点来看,它有点像二重指针,但是,编译器对它的解析却是跟二重指针的解析是完全不一样的。例如下面的代码:
int a[2];如果你这样做,然后对pa进行**pa操作会发现,你悲剧了,但是**(&a)却是OK的。这是因为数组名,是一个地址,但不能跟一般的指针完全等价,而且是const的,编译器对它的解析完全不一样。
追问那(int*)&a是什么意思?
追答如果是传参参xx fun(int* p)这样的函数的参数,直接传a就可以了,不需要(int*)&a。
另外,&a的值跟a的值(抛开类型)是一样的值,你可以试一下:((void*)&a == (void*)a)
是直接传A就可以了,但是有些人写代码就是(int*)&a。我想知道其中的区别。
追答只能说,没必要。但另一种倒比较常用 &a[0]