在下面的代码中,为了在px
和py
之间进行切换,您需要一个指向py
和px
地址的指针来有效地交换它们。
我的问题是int temp
当px
的值被放入其中时它如何返回正确的值,因为没有指向它的指针能够给出正确的值int temp
的地址如何不能克隆给出错误的值?
void swap(int px, int py)
{
int temp;
temp = px;
px = py;
py = temp;
}
//pointer version
void swap(int *px, int *py)
{
int temp;
temp = *px;
*px = *py;
*py = temp;
}
答案 0 :(得分:1)
两个函数都交换int
值。但这种交换是否会影响调用代码的int
s?
使用第二个swap()
时,交换的效果会在原始a,b
中看到,因为该函数与原始 a,b
的地址一起使用。
int a = 1;
int b = 2;
swap_version2(&a, &b);
printf("%d %d\n", a, b); // prints 2 1
使用第一个swap()
,交换的效果在原始c,d
中看不到 。因为swap()
函数正在交换c,d
的副本。净效应:第一个交换功能只是浪费时间。它不会交换c,d
。
int c = 3;
int d = 4;
swap_version1(c, d);
printf("%d %d\n", c, d); // prints 3 4
答案 1 :(得分:1)
您需要了解两件重要事项。
1)在C中调用函数时,参数总是按值传递。如果对函数中的进行更改以保存传递的值,则更改将在函数返回时丢失。换句话说 - 在函数外部看不到函数内部的任何更改。
2)使用指针时,指针前面的*
运算符意味着the location pointed to by the pointer
。它被称为解除引用指针。因此,如果您执行*px = 5;
,则不更改任何指针值!您更改指针指向的位置的值。
仔细查看您的代码:
在你的第一个例子中,你有类似的东西:
void swap(int px, int py)
{
int temp;
temp = px;
px = py;
py = temp;
}
int main(void)
{
int x = 10;
int y = 100;
swap(x, y);
printf("%d %d\n", x, y);
return 0;
}
在C中,所有内容都按值传递。因此,当您致电swap
时,传递给该函数的值为10
和100
。变量x
和y
不。换句话说,函数中的px
和py
与x
中的变量y
和main
无关。这意味着当函数返回且px
和py
不更改时,对变量x
和y
所做的任何更改都将丢失。< / p>
你的第二个例子是这样的:
void swap(int px, int py)
{
int temp;
temp = *px;
*px = *py;
*py = temp;
}
int main(void)
{
int x = 10;
int y = 100;
swap(&x, &y); // Notice the & operator
printf("%d %d\n", x, y);
return 0;
}
一如既往,我们有价值的传递。但在这种情况下,您传递的值是两个pointer to int
的值。更具体地说,您传递了x
和y
的地址。
就像之前你无法改变传递给函数的值一样(就像第一个例子一样)但你可以改变指针所代表的值指着。
在这里,您需要知道指针前面的*
访问指针所指向的内容。
这样做temp = *px
将读取px
指向的值。在这种情况下,它是10
,因此temp
获取值10
。
执行*px = *py
读取值py
指向(即100),并将其放在px
点(即x
main
中100
现在{{{ 1}})。
执行*py = temp
读取值temp
保持(即10)并将其放在py
点(即y
main
中10
的位置{{1 }})。
因此,当函数返回时,x
和y
的值已被交换。
请注意,代码从不使用指向temp
的地址(也称为地址)。变量temp
仅用作普通int
。
答案 2 :(得分:0)
在此功能中
void swap(int *px, int *py)
{
int temp;
temp = *px;
*px = *py;
*py = temp;
}
px
和py
指向交换的值。该函数不会交换指针本身。
要交换指针指向的值,您需要一个中间内存,其中临时存储px
指向的值,该值将被py
指向的值覆盖。
因此,该函数使用临时存储值temp
的本地变量*px
。
请注意此作业声明中的内容
temp = *px;
变量temp
存储px
指向的*px
类型int
的值。它不是指向px
的指针temp
本身。