(初学者)C中的指针

Phe*_*egy 1 c pointers

我被要求编写一个提供的C模块

void swap(struct posn *p, struct posn *q); 
Run Code Online (Sandbox Code Playgroud)

用于交换领域的功能ab.例:

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)

如何交换指针?任何帮助/建议表示赞赏!

leg*_*cia 7

在表达式中*p.x,.运算符的优先级高于*运算符,因此编译器将其理解为*(p.x),这是无效的,因为p它不是带字段的结构x(它是指针).您可以将其编写为(*p).x,也可以使用->为您执行此操作的运算符:p->x.


axi*_*iac 6

你快到了.看起来你理解了指针是如何工作的,但你没有对运算符优先级给予足够的重视.

正如您在列表中看到,"结构和联合成员访问"运算符(.)的优先级高于"间接(取消引用)"运算符(*).

这就是为什么*p.x评估为,*(p.x)但你希望它被评估为(*p).x.

如果你在函数的代码中*p和周围添加括号*q,它将起作用(现在它甚至不编译).

因为这种运算符组合(取消引用后跟成员访问)非常常见,所以语言提供了->操作符,称为"通过指针访问结构和联合成员".

代码p->x相当于(*p).x但它更短,更易读.

你的问题的解决方法非常简单:更换*p.xp->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)