当类型转换为const uint8_t指针时需要&吗?[副本]

kgsdhlau  于 2023-04-29  发布在  其他
关注(0)|答案(1)|浏览(425)

此问题已在此处有答案

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到底是什么意思?

avwztpqn

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())并仅转换函数内部的参数将不那么令人困惑:

void test(const void *buf, size_t size) {
    const uint8_t *p = buf;
    for (size_t i = 0; i < size; i++) {
        Serial.print(p[i]);
    }
}

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(buffer16, sizeof(buffer16));
    Serial.println();
}

相关问题