0

是否可以在同一语句中的指针上使用地址运算符和前缀增量,如果是的话如何?

例子,

#include <stdio.h>
#include <stdint.h>

void main() {
    uint8_t arr_var[2];
    arr_var[0] = 0xa;
    arr_var[1] = 0xf;
    uint8_t *ptr = arr_var;
    uint8_t **dptr = &(++ptr);
}

我收到错误

错误:需要左值作为一元“&”操作数

uint8_t **dptr = &(++ptr);

是否有任何其他选择,而不是使其成为 2 个单独的语句(增量(ptr++),然后是地址(&ptr))。

4

2 回答 2

2

问题:

与 C++ 不同,指针递增/递减在 C 中不返回左值。

addressof 运算符必须有一个左值作为操作数。

解决方案:

由于您想在一个语句中完成您的任务,这里有一个棘手的方法来做到这一点:

uint8_t **dptr = ++ptr ? &ptr : &ptr;

评论部分的其他一些解决方案: -

伦丁uint8_t **dptr = (++ptr, &ptr);

于 2020-01-28T09:42:36.757 回答
2

似乎我被 C 和 C++ 之间的一个区别吓到了……

在 C 中,递增或递减运算符的结果永远不是左值,您只能获取左值的地址。

这个递增/递减参考明确地包括了这个例子&++a,并说它是无效的。

要获得指向ptr您的指针,必须使用 plain &ptr。递增指针之前或之后无关紧要,dptr指向ptr自身的指针也是如此。

于 2020-01-28T09:47:24.090 回答