为什么要投指针?

Red*_*olf 3 c embedded

也许我把人与我的例子搞混了.我试图理解代码的一部分并简化它.这是原始代码的一部分(再次简化...... :))(见下面的原始帖子).

uint16_t hal_nrf_read_multibyte_reg(uint8_t *pbuf)
{
    uint8_t memtype;

    memtype = *(uint8_t*)(&pbuf);

    if (memtype == 0x00U)
    {
        uint8_t data *buf = (uint8_t data *)pbuf;
        DOTHIS
    }

    if (memtype == 0x01U)
    {
        uint8_t xdata *buf = (uint8_t data *)pbuf;
        DOTHAT
    }

    if (memtype == 0xFEU)
    {
        uint8_t pdata *buf = (uint8_t data *)pbuf;
        DOSOMETHING
    }

    return SOMETHING;
}

void main()
{
    uint8_t payload[3];

    hal_nrf_read_multibyte_reg(payload);

    while(1) { }
}
Run Code Online (Sandbox Code Playgroud)

所以我想知道,他们为什么要施放已经是uint8_t的pbuf.但我想我现在得到了答案.

------------旧帖子-------------

我正在探索Nordic Semiconductors nRF24LE1.

如果我有以下测试代码.

void tempF(int *test)
{
    int varA;
    int varB;
    int varC;

    varA = *(int*)(&test);   // The way it is done in the source code
    varB = *(&test);
    varC = test;

    printf("A: %x\n", varA);
    printf("B: %x\n", varB);
    printf("C: %x\n", varC);
    printf("C1: %x\n", test);

    if (test == 0x00)
        printf("equals 0x00");
}

int main(void) {
    int myArray[3];

    tempF(myArray);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

printfs都给出了相同的答复.做"varA式"的原因是什么?有必要的例子?

如果我在varA中使用方式,我不会收到警告"警告C260:'=':指针截断.

Joh*_*ger 6

你的三个样本基本上都是将一个指针转换为一个int.从技术上讲,这需要在你的情况下,投BC,和你的编译器应该提醒你一下.例如:

int varC = (int) test;
Run Code Online (Sandbox Code Playgroud)

演员阵容,这是完全有效的,但没有,没有.然而,您的编译器可能生成相同的代码,无论是否.

但是,在示例代码中,表达式的类型&testint **.铸造该类型的表达到int *和解除引用的结果,如做是为了将值分配给varA,旨在具有重新解释的字节的效果test的那些的int,如用C++ reinterpret_cast.这不一定产生与test直接转换为a 相同的值int,就像分配值一样varC.如果指针的大小int与目标系统上的大小不同,它们特别容易出现差异,但即使大小相同,它们也不需要产生相同的结果.

另一方面,将*运算符直接应用于运算符的结果&没有净效果,因此计算的值varB将可靠地与计算的值相同varC.