我被要求编写一个提供的C模块
void swap(struct posn *p, struct posn *q);
Run Code Online (Sandbox Code Playgroud)
用于交换领域的功能a和b.例:
struct posn { int x; int y; };
struct posn a = {1, 2};
struct posn b = {3, 4};
swap(&a, &b);
assert(a.x == 3);
assert(a.y == 4);
assert(b.x == 1);
assert(b.y == 2);
Run Code Online (Sandbox Code Playgroud)
然而,这两个*p,*q都是指针,所以下面的代码,我写不工作:
void swap(struct posn *p, struct posn *q)
{
int temp1 = *p.x;
int temp2 = *p.y;
*p.x = *q.x;
*p.y = *q.y;
*q.x = temp1;
*q.y = temp2;
}
Run Code Online (Sandbox Code Playgroud)
如何交换指针?任何帮助/建议表示赞赏!
在表达式中*p.x,.运算符的优先级高于*运算符,因此编译器将其理解为*(p.x),这是无效的,因为p它不是带字段的结构x(它是指针).您可以将其编写为(*p).x,也可以使用->为您执行此操作的运算符:p->x.
你快到了.看起来你理解了指针是如何工作的,但你没有对运算符优先级给予足够的重视.
正如您在列表中看到的,"结构和联合成员访问"运算符(.)的优先级高于"间接(取消引用)"运算符(*).
这就是为什么*p.x评估为,*(p.x)但你希望它被评估为(*p).x.
如果你在函数的代码中*p和周围添加括号*q,它将起作用(现在它甚至不编译).
因为这种运算符组合(取消引用后跟成员访问)非常常见,所以语言提供了->操作符,称为"通过指针访问结构和联合成员".
代码p->x相当于(*p).x但它更短,更易读.
你的问题的解决方法非常简单:更换*p.x与p->x无处不在:
void swap(struct posn *p, struct posn *q)
{
int temp1 = p->x;
int temp2 = p->y;
p->x = q->x;
p->y = q->y;
q->x = temp1;
q->y = temp2;
}
Run Code Online (Sandbox Code Playgroud)