2016-09-21 20 views
0

我的指針程序出了問題,它應該使用雙指針切換double值x和y的值。我對指針非常陌生,我無法做到這一點。現在使用雙指針切換變量的值

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贏得了「T交換:

#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; 
} 

的輸出!儘管我參考了* a =&ValueOfB;但據我瞭解& ptr_x - > ptr_x - > x所以如果我寫* a = & ValueOfB我也可以用ptr_x替換* a,這樣我就可以進一步替換爲ptr_x = & y!這應該工作

+6

打開編譯器警告,並注意它們。它應該抱怨函數參數與實際參數之間的不匹配類型。 –

+0

你確定你粘貼了從*一個*運行中獲得的* exact *輸出嗎?請仔細檢查。 – alk

+0

對於需要傳遞地址的printf地址。你通過雙打。 – alk

回答

0

因爲您將double *傳遞給期望值爲double **的函數,所以您執行的操作不起作用。這些類型不兼容,並試圖以這種方式使用它們會導致undefined behavior

隨着你的編輯,它仍然不會工作,因爲ptr_xptr_y被修改,以包含變量valueOfAvalueOfBswitch_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; 
} 

EDIT2:

該地址並沒有改變,而是因爲你沒有正確打印他們來說,可能會出現這樣:

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 *之一。

+0

我知道它的工作方式,但交換需要以這種形式: void swap(double ** a,double ** b){...}這是挑戰! – Raavgo

+0

@Raavgo看我的編輯。 – dbush

+0

現在好了值交換,但指針的地址也是如此。如何將** a存儲在同一個地點** b存儲? – Raavgo

0

看你在做什麼這裏:

switch_pp(&x,&y);

和比較,您swap功能:

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

你會說&x的類型是?

+0

這會更好地適合作爲評論。 – alk

+0

@alk [手持答案](http://meta.stackoverflow.com/q/255896/643383)有明顯的作業問題。我所寫的內容儘可能接近於回答這個問題,而不用爲OP進行拼寫,我認爲這是回答這種問題最合適的方法。 – Caleb

+0

呃,夠公平,有道理,是的。 – alk