C 使用指针交换
在下面的代码中,为了在px和py之间进行交换,您需要一个指针来指向py和px的地址,以便有效地交换它们 我的问题是,当px的值被放入int-temp时,它如何返回正确的值,因为没有指向它的指针能够给出正确的值,以及int-temp的地址如何不克隆以给出错误的值C 使用指针交换,c,pointers,C,Pointers,在下面的代码中,为了在px和py之间进行交换,您需要一个指针来指向py和px的地址,以便有效地交换它们 我的问题是,当px的值被放入int-temp时,它如何返回正确的值,因为没有指向它的指针能够给出正确的值,以及int-temp的地址如何不克隆以给出错误的值 void swap(int px, int py) { int temp; temp = px; px = py; py = temp; } //pointer version void swap(in
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;
}
在这个函数中
void swap(int *px, int *py)
{
int temp;
temp = *px;
*px = *py;
*py = temp;
}
有px和py指向的交换值。函数本身不交换指针
要交换指针指向的值,您需要一个中间内存,临时存储px指向的值,该值将被py指向的值覆盖
因此,该函数使用临时存储值*px的局部变量temp
请注意本作业说明中的内容
temp = *px;
变量temp存储px指向的值,即具有int类型的*px。分配给temp的不是指针px本身。两个函数都交换int值。但是这种交换会影响调用代码的整数吗
对于第二次交换,交换的效果可以在原始a,b中看到,因为该函数与原始a,b的地址一起工作
对于第一次交换,交换的效果在原始c、d中看不到。由于交换功能是交换c、d的副本。净效果:第一个交换函数只是浪费时间。它不交换c,d
有两件事你需要知道 1在C中调用函数时,参数总是按值传递。如果在函数内部对保存传递值的变量进行更改,则在函数返回时更改将丢失。换句话说,在函数内部所做的任何更改都不能在函数外部看到 2使用指针时,指针前面的*运算符表示指针指向的位置。这称为取消对指针的引用。所以如果你这样做,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与main中的变量x和y无关。这意味着,当函数返回且x和y不变时,对变量px和py所做的任何更改都将丢失
您的第二个示例如下所示:
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;
}
像往常一样,我们有传递价值。但在本例中,传递的值是指向int的两个指针的值。更具体地说,传递x和y的地址
就像前面一样,您不能像第一个示例那样更改传递给函数的值,但是您可以更改指针指向的任何对象的值
这里您需要知道,在指针前面*可以访问指针指向的任何对象
因此,执行temp=*px将读取px指向的值。在本例中,它是10,因此temp得到值10
Doing*px=*py读取py指向即100的值,并将其放置在px指向即main中的x现在为100的位置
Doing*py=temp读取temp保持的值,即10,并将其放置在py点,即main中的y现在为10的位置
因此,当函数返回时,x和y的值已交换
注意,代码从不使用指向临时地址的指针。变量temp仅用作普通整数。当px的值完全不清楚您的要求时。您不能只传递值而期望它们更改原始值。请提供一个链接,然后查看!如果你问第二个版本是如何工作的,它是一个int,而不是两个参数那样的指针,那是因为它交换了它们指向的值,奥拉夫的第一个函数给出了错误的答案,因为指针指向一个地址,所以结果不是预期的,但是在第二个版本中,也没有指针指向int MtP,所以为什么给出期望值而不改变被放入其中的值?你的问题由两个答案中的一个来回答?如果是,请接受相关答案。
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;
}
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;
}