我的指针程序出了问题,它应该使用双指针来切换双值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!应该工作
答案 0 :(得分:0)
看看你在这做什么:
switch_pp(&x,&y);
并将其与您的swap
函数进行比较:
void switch_pp(double** a,double** b)
您认为&x
的类型是什么?
答案 1 :(得分:0)
由于您将double *
传递给期望double **
的函数,因此您无法正常工作。这些类型不兼容,并尝试以这种方式使用它们会产生undefined behavior。
通过编辑,它仍然无法正常工作,因为ptr_x
和ptr_y
被修改为包含valueOfA
和valueOfB
内的变量地址{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 *
的时间之一。