我遇到了一些使用引用/解引用(或您选择称呼它们的任何内容)运算符*
和&
同时进行的C代码,例如&*foo
和*&bar
。我感到困惑。这样做有什么原因吗?
我遇到了一些使用引用/解引用(或您选择称呼它们的任何内容)运算符*
和&
同时进行的C代码,例如&*foo
和*&bar
。我感到困惑。这样做有什么原因吗?
是的,它们可以有意义地使用:一个有效的用例是在宏定义中检查宏参数是否符合要求。
&*foo
验证 foo
是否为指针类型(可能是从数组或函数类型进行隐式转换后)。
*&foo
验证 foo
是否为左值表达式。
例如,尽管这个例子非常简单,但它可能会有点滥用宏:
void f(int *);
#define F(x) (f(&*(x)))
void g(int *);
#if A
#define G(x) (g(x), (x)=0)
#elif B
#define G(x) (g(*&(x)))
#endif
void h(int *p, int i) {
f(p); // okay
F(p); // still okay, does the same thing as f(p)
f(i); // typically just a compiler warning
F(i); // pretty much always a compiler error
g(p); // okay
G(p); // okay
g(p+0); // okay
G(p+0); // error if A because of the modification
// should be an error if B even without modification
}
*&foo
添加一个例子以验证foo
是左值表达式? - Stanislav Pankevich=
与 ==
问题。 - Sourav Ghosh&*p1 == &*p2
来捕捉那个。你见过吗? - user743382&*ptr
包含了一个提示,告诉编译器 ptr != NULL
(否则 *ptr
将会导致未定义的行为)。
*&
可能只是维护更改的结果,其中辅助指针变量被消除:
struct {
int i;
double
} x;
void foo() {
int* ip = &x.i;
...
*ip = 1;
...
}
在上面的代码中直接用 &x.i
替换 ip
,将会产生一个 StackOverflow 上的问题:
struct {
int i;
double
} x;
void foo() {
...
*&x.i = 1; // <---
...
}
同样地,&*
可能是通过重构更改引入的,该重构替换了 lvalue 为指针。
重构之前:
int main() {
struct sockaddr_in serv_addr;
...
bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
...
}
将服务器设置代码提取到自己的函数中后:
void setup_server(struct sockaddr_in* serv_addr) {
...
bind(sockfd, (struct sockaddr *) &*serv_addr, sizeof(*serv_addr));
...
}
int main() {
struct sockaddr_in serv_addr;
...
setup_server(&serv_addr);
...
}