如何在同一语句中对指针使用地址运算符和前缀增量?
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
本身的指针。
是否可以在同一语句中对指针使用地址运算符和前缀递增,如果是的话如何?
示例,
#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
本身的指针。