我对指针有点困惑,我想更新变量tmpTwoComplement,如果我像这段代码一样更新,它确实可以工作:

int16_t max30205MeasureTemperature(int16_t *tmpTwoComplement) {

    char regT = MAX30205_REG_TEMPERATURE;

    max30205_raw_data rawTemp;

    max30205_read_reg_as_temperature(regT, &rawTemp);

    *tmpTwoComplement = rawTemp.swrd;
}

但这个没有,为什么?
int16_t max30205MeasureTemperature(int16_t *tmpTwoComplement) {

    char regT = MAX30205_REG_TEMPERATURE;

    max30205_raw_data rawTemp;

    max30205_read_reg_as_temperature(regT, &rawTemp);

    tmpTwoComplement = &rawTemp.swrd;
}

我总是把上面的函数称为
max30205MeasureTemperature(&registerTemp);

存在
typedef union max30205_raw_data {
    struct {
        uint8_t lsb;
        uint8_t msb;
    };
    struct {
        uint16_t magnitude_bits:15;
        uint16_t sign_bit:1;
    };
    uint16_t uwrd;
    int16_t swrd;
} max30205_raw_data;

tempSamplesUpdatedMAX30205 = true;

最佳答案

*tmpTwoComplement = rawTemp.swrd;

您将rawTemp.swrd的值写入tmpTwoComplement所指向的位置,该位置恰好是变量registerTemp的地址,因为您调用函数的方式:max30205MeasureTemperature(&registerTemp)。因此,在退出函数后,registerTemp将包含一个在cc>内的值的副本。
tmpTwoComplement = &rawTemp.swrd;

在这种情况下。将局部变量rawTemp.swrd的地址复制到指针rawTemp.swrd中,覆盖先前在指针中的tmpTwoComplement地址。退出函数后,不会发生任何事情,因为函数的所有内部变量不再存在,并且代码没有写入函数之外的任何变量。
您应该了解的是registerTemp是指向某个内存位置的指针。在第二种情况下,你总是可以让它指向不同的位置。但这本身并没有任何效果。实际上,您要做的是写入它指向的目标内存位置。这是通过使用tmpTwoComplement来完成的。
编辑:
你为什么不这样做,完全避免指针?
int16_t max30205MeasureTemperature(void) {
    char regT = MAX30205_REG_TEMPERATURE;

    max30205_raw_data rawTemp;

    max30205_read_reg_as_temperature(regT, &rawTemp);

    return rawTemp.swrd;
}

然后一起读,
registerTemp = max30205MeasureTemperature();

10-07 17:03