HOME> 世界杯2022年> 为什么交换函数只在使用指针时起作用?

为什么交换函数只在使用指针时起作用?

2025-08-29 02:09:22

C是一种按值传递的语言。一直都是。这意味着:

代码语言:javascript运行复制void swap(int x, int y)

{

int temp = x;

x = y;

y = temp;

}您将交换x和y的值,这是从传递给函数的值中获得的。当您像这样调用时:

代码语言:javascript运行复制int main()

{

int a = 33, b = 55;

swap (a, b); // passing values of a and b

printf("a = %d, b = %d\n", a, b);

}传递a和b的值。所以这就是你的问题。解决方案是使传递的值可以用来修改调用者的变量。如果你想修改这些变量,它们需要以某种方式从被调用的代码中寻址。嗯..。

这种机制被称为“按地址传递”,虽然听起来很花哨,但实际上并非如此,它只是对按值传递的重新组合,但具有不同的值类型。然而,在我们传递int类型的值之前,我们将改为传递整数变量的地址,并将形参声明为指向int的指针。别搞错了。它们仍然是值,但不是基本的int类型。相反,传递的值是int变量的地址。要访问这些地址上的数据,需要将指针与取消引用运算符(有几种类型,此处仅显示一种)结合使用:

代码语言:javascript运行复制void swap(int *ptrToX, int *ptrToY)

{

int temp = *ptrToX; // dereference right, store value in temp

*ptrToX = *ptrToY; // dereference both, assigning value from right to left.

*ptrToY = temp; // dereference left, assign temp value

}并像这样调用:

代码语言:javascript运行复制int main()

{

int a = 33, b = 55;

swap (&a, &b); // passing addresses of a and b

printf("a = %d, b = %d\n", a, b);

}注意:通过值传递的例外通常是传递数组,这通常是错误的。虽然“腐烂到指针”这句话就像除夕夜的五彩纸屑一样被抛来抛去,但我讨厌这种俗语。动词本身暗示着一个函数操作,而实际上没有。

语言指定数组的值表达式中使用的是其第一个元素的地址。换句话说,它的“值”已经是一个地址,因此可以简单地按值传递给一个函数,该函数需要一个指向相同基类型的指针。因为它是一个地址,所以接收参数(一个指针,因为它保存着地址值)可以用来修改来自调用者的数组内容。仅次于多级间接(指针指向指针等),对于刚接触C语言的人来说,这是最难理解的事情,但你这样做很重要。

陌远科技

电信光猫科学上网全攻略:设置与优化指南

最新发表 newmodule
友情链接 newmodule