交换功能如何工作(使用指针)?
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 是如何交换的 当我们实际交换 a
和b
在下面的函数中。我不知道 'x and y' 和 'a and b' 之间的关系是什么。
我知道 *
是一个指针,'&' 给出了事物的地址,但我不知道它是如何指向 x
和 y
当它们(x
和 y
)未在实际函数中提及时。
我不知道 'placeholder' 正在使用什么。
如果可以请解释一下!
当你将 x 和 y 的地址传递给 swap 函数时。该函数的参数指向新的地址,和函数一样交换两个地址的内容。
因为a
和b
是指针,你实际上是把main()
中x
和y
的地址作为参数传给了函数swap()
参考 :
swap(&x, &y);
如果您使用 &
运算符,它会获得一个对象的地址。
参数a
由x
的地址赋值,参数b
由y
的地址赋值。
如果你正确地取消引用指针 a
和 b
并且有一个正确的算法(就像在这种情况下一样),你可以交换 x
和 [=15 的值=] 在 main()
内部,而不是指针 a
和 b
.
的值
说说算法本身:
int tmp = *a;
*a = *b;
*b = tmp;
int tmp = *a;
- x
的值被分配给一个临时对象。这是必需的,因为我们在下一步更改 x
的值。
*a = *b;
- y
的值赋值给 x
.
*b = tmp;
- 之前存储在 x
中并存储在 tmp
之间的值(临时对象)现在分配给 y
.
请注意,在所有这些步骤中,*
运算符并不意味着要声明一个指针两次。它用于 取消引用 指针。
有关“解除引用”的更多信息,请查看:
What does "dereferencing" a pointer mean?
如果x
和y
的值已经通过值(没有&
)和参数a
和 b
只是 int
类型,而不是 int *
那么你只能在 swap()
.[= 中更改 a
和 b
53=]
我建议你学习更多关于指针的知识。例如在 Modern C made by community member @JensGustedt.
的免费副本中
#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 是如何交换的 当我们实际交换 a
和b
在下面的函数中。我不知道 'x and y' 和 'a and b' 之间的关系是什么。
我知道 *
是一个指针,'&' 给出了事物的地址,但我不知道它是如何指向 x
和 y
当它们(x
和 y
)未在实际函数中提及时。
我不知道 'placeholder' 正在使用什么。
如果可以请解释一下!
当你将 x 和 y 的地址传递给 swap 函数时。该函数的参数指向新的地址,和函数一样交换两个地址的内容。
因为a
和b
是指针,你实际上是把main()
中x
和y
的地址作为参数传给了函数swap()
参考 :
swap(&x, &y);
如果您使用 &
运算符,它会获得一个对象的地址。
参数a
由x
的地址赋值,参数b
由y
的地址赋值。
如果你正确地取消引用指针 a
和 b
并且有一个正确的算法(就像在这种情况下一样),你可以交换 x
和 [=15 的值=] 在 main()
内部,而不是指针 a
和 b
.
说说算法本身:
int tmp = *a;
*a = *b;
*b = tmp;
int tmp = *a;
-x
的值被分配给一个临时对象。这是必需的,因为我们在下一步更改x
的值。*a = *b;
-y
的值赋值给x
.*b = tmp;
- 之前存储在x
中并存储在tmp
之间的值(临时对象)现在分配给y
.
请注意,在所有这些步骤中,*
运算符并不意味着要声明一个指针两次。它用于 取消引用 指针。
有关“解除引用”的更多信息,请查看:
What does "dereferencing" a pointer mean?
如果x
和y
的值已经通过值(没有&
)和参数a
和 b
只是 int
类型,而不是 int *
那么你只能在 swap()
.[= 中更改 a
和 b
53=]
我建议你学习更多关于指针的知识。例如在 Modern C made by community member @JensGustedt.
的免费副本中