交换功能如何工作(使用指针)?

How does the swap function work (pointer is used)?

#include <stdio.h>

void swap(int *a, int *b);

int main(void)
{
    int x = 1;
    int y = 2;

    printf("x is %i, y is %i\n", x, y);
    swap(&x, &y);
    printf("x is %i, y is %i\n", x, y);
}

void swap(int *a, int *b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

在这段代码中(顺便说一句,我没有写)我不明白 x 和 y 是如何交换的 当我们实际交换 ab 在下面的函数中。我不知道 'x and y' 和 'a and b' 之间的关系是什么。

我知道 * 是一个指针,'&' 给出了事物的地址,但我不知道它是如何指向 xy当它们(xy)未在实际函数中提及时。

我不知道 'placeholder' 正在使用什么。

如果可以请解释一下!

当你将 x 和 y 的地址传递给 swap 函数时。该函数的参数指向新的地址,和函数一样交换两个地址的内容。

因为ab是指针,你实际上是把main()xy的地址作为参数传给了函数swap() 参考 :

swap(&x, &y);

如果您使用 & 运算符,它会获得一个对象的地址。

参数ax的地址赋值,参数by的地址赋值。

如果你正确地取消引用指针 ab 并且有一个正确的算法(就像在这种情况下一样),你可以交换 x 和 [=15 的值=] 在 main() 内部,而不是指针 ab.

的值

说说算法本身:

int tmp = *a;
*a = *b;
*b = tmp;
  1. int tmp = *a; - x 的值被分配给一个临时对象。这是必需的,因为我们在下一步更改 x 的值。

  2. *a = *b; - y 的值赋值给 x.

  3. *b = tmp; - 之前存储在 x 中并存储在 tmp 之间的值(临时对象)现在分配给 y.

请注意,在所有这些步骤中,* 运算符并不意味着要声明一个指针两次。它用于 取消引用 指针。

有关“解除引用”的更多信息,请查看:

What does "dereferencing" a pointer mean?


如果xy的值已经通过(没有&)和参数ab 只是 int 类型,而不是 int * 那么你只能在 swap().[= 中更改 ab 53=]


我建议你学习更多关于指针的知识。例如在 Modern C made by community member @JensGustedt.

的免费副本中