此问题已在此处有答案:
Is an array name a pointer?(9个回答)
What is array to pointer decay?(11个答案)
Exceptions to array decaying into a pointer?(1个答案)
6天前关闭。
我正在使用Arduino C中的一个函数,该函数与将数据写入SD卡上的二进制文件相关联。原型函数是:
write(const uint8_t *buf, size_t len);
write接受指向const uint8_t
类型变量的指针,所以如果我处理的缓冲区包含uint16_t
类型元素,我必须对它们进行类型转换以使用write函数。我用Arduino测试了一下:
uint8_t buffer8[10];
uint16_t buffer16[10];
void setup() {
Serial.begin(9600);
for(int i = 0; i<10; i++){
buffer8[i] = i;
buffer16[i] = i;
}
test(buffer8,sizeof(buffer8));
Serial.println();
test((const uint8_t *)buffer16, sizeof(buffer16)); //Without &
Serial.println();
test((const uint8_t *)&buffer16, sizeof(buffer16)); //With &
Serial.println();
}
void loop() {}
void test(const uint8_t *buf, size_t len){
for(int i = 0; i<len; i++){
Serial.print(buf[i]);
}
}
我得到的输出是正确的:
0123456789
00102030405060708090
00102030405060708090
当我在buffer16
上调用test-function时,我执行了两次。第一次不包含&:test((const uint8_t *)buffer16, sizeof(buffer16));
。我第二次包含&:test((const uint8_t *)&buffer16, sizeof(buffer16));
。
但是两个函数调用产生相同的输出。所以我的问题是当我像这样键入强制转换时,我必须包括&吗?(const uint8_t *)&buffer16
到底是什么意思?
1条答案
按热度按时间avwztpqn1#
下面是一个简单的英语翻译:
(const uint8_t *)buffer16
表示将buffer16
转换为指向不应用于修改对象的uint8_t
字节的指针。buffer16
是一个数组,所以当在表达式中使用时,它会衰减为指向其第一个元素的指针。您正在将数组第一个元素的地址作为指向各个字节的指针传递。(const uint8_t *)&buffer16
表示将&buffer16
转换为指向不应用于修改对象的uint8_t
字节的指针。&buffer16
是一个数组的地址,一个类型为uint16_t (*)[10]
的指针指向数组,因此与buffer16[0]
的地址相同,因此您也将数组的第一个元素的地址作为指向单个字节的指针传递,但中间转换无效且令人困惑。请注意,将
test
定义为接受const void *
(如write()
)并仅转换函数内部的参数将不那么令人困惑: