gpt4 book ai didi

c - 使用双指针切换变量的值

转载 作者:行者123 更新时间:2023-11-30 16:57:18 25 4
gpt4 key购买 nike

我的指针程序有问题,它应该使用双指针来切换 double 值 x 和 y 的值。我对指针还很陌生,但我无法做到这一点。

#include <stdio.h>
#include <math.h>

/*
todo
implement switch_pp(**a,**b)
switch the content of a,b using double pointers
Only switch the values all pointer addresses must remain the same!
*/

void switch_pp(double** a,double** b){
double valueOfA = **a;
double valueOfB = **b;
*a = &valueOfB;
*b = &valueOfA;
}

int main(int argc, char* argv[]){

double x = 14.435,y = 4.435; //needs to work with these parameters
double *ptr_x = &x, *ptr_y= &y;

printf("Swapping x and y\n");
printf("X -> address: %p | value: %f || Y-> address: %p | value: %f\n", x,x,y,y);
switch_pp(&ptr_x,&ptr_y);
printf("Done swapping x and y\n");
printf("X -> address: %p | value: %f || Y-> address: %p | value: %f\n", x,x,y,y);
return 0;
}

输出为:

Swapping x and y
X -> address: A3D70A3D | value: -0.000000 || Y-> address: 4011BD70 | value: 4.435000
Done swapping x and y
X -> address: A3D70A3D | value: -0.000000 || Y-> address: 4011BD70 | value: 4.435000

Process returned 0 (0x0) execution time : 0.016 s
Press any key to continue.

好吧,现在我重写了我的代码,但 x,y 的值仍然不会交换!虽然我引用 *a = &ValueOfB;但据我了解 &ptr_x -> ptr_x -> x 所以如果我写 *a = &ValueOfB 我也可以用 ptr_x 替换 *a 这样我就可以进一步替换为 ptr_x = &y!哪个应该有效

最佳答案

你原来的东西不起作用,因为你传递了 double *到一个需要 double ** 的函数。这些类型不兼容,尝试以这种方式使用它们会导致 undefined behavior .

经过您的编辑,它仍然无法工作,因为 ptr_xptr_y修改为包含变量 valueOfA 的地址和valueOfB switch_pp里面。当函数返回时,这些变量超出范围,因此尝试再次取消引用这些指针会导致未定义的行为。

如果要交换指针,则只需要一个双指针(即指向指针的指针)。但您不是交换指针,而是交换 double 类型的值。因此,只需传递每个地址并交换每个地址所指向的内容即可:

void swap(double *a, double *b)
{
double tmp = *a;
*a = *b;
*b = tmp;
}

然后这样调用它:

swap(&a, &b);

编辑:

如果您确实需要传递指针到指针,请执行以下操作:

void swap(double **a, double **b)
{
double tmp = **a;
**a = **b;
**b = tmp;
}

编辑2:

地址没有改变,但可能会这样显示,因为您没有正确打印它们:

printf("X -> address: %p | value: %f || Y-> address: %p | value: %f\n", x,x,y,y);

在这里,您正在传递 double%p格式说明符需要 void * 。你想要这个:

printf("X -> address: %p | value: %f || Y-> address: %p | value: %f\n", (void *)ptr_x,x,(void *)ptr_y,y);

请注意,这是您实际上需要将指针强制转换为 void * 的罕见情况之一。 .

关于c - 使用双指针切换变量的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39619990/

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