gpt4 book ai didi

c - 为什么交换函数只在使用指针时有效?

转载 作者:太空宇宙 更新时间:2023-11-04 05:58:22 24 4
gpt4 key购买 nike

这是我的意思的一个例子。这个例子没有使用指针,变量也没有交换。

void  swap(int x, int y);
main()
{
int a = 33, b = 55;
swap (a, b);
printf("a = %d, b = %d\n", a, b);
}

void swap(int x, int y)
{
int temp;
temp = x;
x = y;
y = temp;
}

现在如果你使用指针,变量 a 和 b 交换。为什么它只适用于指针?

最佳答案

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

void swap(int x, int y)
{
int temp = x;
x = y;
y = temp;
}

您正在交换 xy,从传递给函数的中获得.当您这样调用时:

int main()
{
int a = 33, b = 55;
swap (a, b); // passing values of a and b
printf("a = %d, b = %d\n", a, b);
}

ab 被传递。所以这是你的问题。解决方案是使 传递可用于修改调用者变量的内容。如果您想修改这些变量,它们需要以某种方式从被调用的代码中可寻址。嗯……

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

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
}

并像这样调用:

int main()
{
int a = 33, b = 55;
swap (&a, &b); // passing addresses of a and b
printf("a = %d, b = %d\n", a, b);
}

注意:通常引用不当,因为按值传递的异常(exception)是传递一个数组。虽然“decays to a pointer”这个词在新年前夜像五彩纸屑一样被抛来抛去,但我讨厌这种白话。这个动词本身暗示了一个功能性操作,而事实上,没有

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

关于c - 为什么交换函数只在使用指针时有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23002785/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com