使用双指针切换变量值

时间:2016-09-21 14:55:20

标签: c pointers

我的指针程序出了问题,它应该使用双指针来切换双值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 =&amp; ValueOfB;但据我所知,&amp; ptr_x - &gt; ptr_x - &gt; x所以如果我写* a =&amp; ValueOfB我也可以用ptr_x替换* a所以我可以进一步替换ptr_x =&amp; y!应该工作

2 个答案:

答案 0 :(得分:0)

看看你在这做什么:

  

switch_pp(&x,&y);

并将其与您的swap函数进行比较:

  

void switch_pp(double** a,double** b)

您认为&x的类型是什么?

答案 1 :(得分:0)

由于您将double *传递给期望double **的函数,因此您无法正常工作。这些类型不兼容,并尝试以这种方式使用它们会产生undefined behavior

通过编辑,它仍然无法正常工作,因为ptr_xptr_y被修改为包含valueOfAvalueOfB内的变量地址{1}}。当函数返回时,这些变量超出范围,因此尝试再次取消引用这些指针会导致未定义的行为。

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

double

然后这样称呼:

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

编辑:

如果你真的需要传递一个指向指针的指针,那就这样做:

swap(&a, &b);

EDIT2:

地址没有变化,但可能会出现这种情况,因为您没有正确打印它们:

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

在这里,您将printf("X -> address: %p | value: %f || Y-> address: %p | value: %f\n", x,x,y,y); 传递给期望double的{​​{1}}格式说明符。你想要这个:

%p

请注意,这是您实际需要将指针强制转换为void *的时间之一。