如何在同一语句中对指针使用地址运算符和前缀增量?

How to use address-of operator along with prefix increment on pointers in the same statement?

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

示例,

#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);
}

我遇到错误

error: lvalue required as unary '&' operand

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

是否有其他替代方法而不是使它成为 2 个单独的语句(递增 (ptr++) 和地址 (&ptr))。

问题:

与 C++ 不同,指针 incrementation/decrementation 不是 return C 中的左值。

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

解法:

由于您想在一条语句中完成任务,这里有一个巧妙的方法:

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

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

Lundin: uint8_t **dptr = (++ptr, &ptr);

我似乎被 C 和 C++ 之间的一个区别搞糊涂了...

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

This increment/decrement reference 明确包含示例 &++a 并表示它无效。

要获得指向 ptr 的指针,您必须使用纯 &ptr。在增加指针之前或之后并不重要,因为 dptr 将是指向 ptr 本身的指针。