为什么要投指针?

时间:2016-03-29 13:19:09

标签: c embedded

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

     <script language = "JavaScript">
        location.href  = "C:../mypage.html";
        setTimeout("document.location = 'C:..mypage.html'",1000);
</script>

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

------------ OLD POST -------------

我正在探索Nordic Semiconductors nRF24LE1。

如果我有以下测试代码。

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) { }
}

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

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

4 个答案:

答案 0 :(得分:6)

您的三个示例基本上都是将指针转换为int。从技术上讲,这需要在您的案例BC中进行强制转换,并且您的编译器应该警告您。例如:

int varC = (int) test;

使用演员,这是完全有效的,但没有,不是。尽管如此,您的编译器可能生成相同的代码,无论是否。

但是,在示例代码中,表达式&test的类型为int **。将该类型的表达式转换为int *并取消引用结果,就像为varA赋值一样,旨在将test的字节重新解释为一个int,与C ++ reinterpret_cast一样。这不一定产生与将test直接转换为int相同的值,就像为varC指定值一样。如果指针的大小与目标系统上int的大小不同,它们特别容易出现差异,但即使大小相同,它们也不需要产生相同的结果。< / p>

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

答案 1 :(得分:1)

问题是任何指针类型都不需要与int大小相同。编译器很遗憾地警告你这个事实。

使用(int *)(&test)将测试的地址转换为指向int 的指针。 取消引用它会产生一个int,可以很快地将其分配给int变量。如果指针需要的位数多于int可以容纳的数量,那么它仍然可能会被截断,但是您确信编译器确实知道您在做什么并且它是按目的发生的。

答案 2 :(得分:1)

鉴于您的示例变量实际上是int

int varA;
int varB;
int varC;

如果没有使用GCC编译器版本4.4.7或更新版本并使用注释中所述的stdio.h,代码将无法编译,由于非法类型'int'和',您的后两个语句将会出错指向int'

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

如果他们是int *

int *varA;
int *varB;
int *varC;

然后第一个语句:varA = *(int*)(&test);会出错。

赋值语句编译的唯一方法是使用如下声明的变量:

int varA;
int *varB;
int *varC;

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

答案 3 :(得分:0)

varA = *(int*)(&test);表示test的按位表示解释为int,然后将其存储在var 中。

演员(int *)表示test的按位表示应解释为int,而*运算符将其解释为int }。

如果memcpy(&varA, &test, sizeof varA);,则与sizeof (int) == sizeof (int *)相同。