2014-09-21 16 views
-3

功能swap2有兩個參數,int *a,和int *b的存儲器交換混淆。這些是指向整數值指針的指針。那麼爲什麼當你在swap2執行如int tmp = *a; *a = *b;這樣的行時,它是否會改變這些值的內存位置。 *不會參考在參數中聲明的指針嗎?由指針

int main() 
{ 
     int x = 42; 
     int y = 9; 
     printf("x = %d, y = %d\n", x, y); 
     swap1(x,y); 
     printf("x = %d, y = %d\n", x, y); 
     x = 42, y = 9; 
     swap2(&x, &y); 
     printf("x = %d, y = %d\n", x, y); 
     printf("---\n"); 
     int z = 77, w = 33; 
     int *p = &z; 
     int *q = &w; 

     printf("*p = %d, *q = %d, p = %p, q = %p\n", *p, *q, p, q); 
     swap2(p,q); 

     z = 77, w = 33; 
     printf("*p = %d, *q = %d, p = %p, q = %p\n", *p, *q, p, q); 
     swap3(&p, &q); 
     printf("*p = %d, *q = %d, p = %p, q = %p\n", *p, *q, p, q); 

     printf("z = %d, w = %d\n", z, w); 

     return 0; 
} 

void swap1(int a, int b) 
{ 
     int tmp = a; 
     a = b; 
     b = tmp, 
     printf("a = %d, b = %d\n", a, b); 
} 

void swap2(int *a, int *b) 
{ 
     int tmp = *a; 
     *a = *b; 
     *b = tmp; 
     printf("*a = %d, *b = %d\n", *a, *b); 
} 

void swap3(int **a, int **b) 
{ 
     int *tmp = *a; 
     *a = *b; 
     *b = tmp; 
     printf("**a = %d, **b = %d\n", **a, **b); 
} 
+1

'swap3'將指針*指針*指向整數,其中有兩個級別。 – dreamlax 2014-09-21 23:33:10

+1

swap1是無用的,唯一的影響是打印診斷。 swap2是'int's(+診斷)的標準交換。 swap3是交換'int *'s,但診斷並不是最好的......無論如何,您可以將前向聲明(與源文件的省略頭部中的includes一起,我衷心希望)如果您定義函數並在之後使用它們。 – Deduplicator 2014-09-21 23:35:58

回答

1

更新

swap2 (int *a, int *b)不會改變任何內存位置,它改變什麼ab指向,當你調用swap2(&x, &y),你的內存架構將如下所示:

       int x 
[a (address of x)] -> [actual x = 42] 

          int y 
[b (address of y)] -> [actual y = 9] 

int tmp = * a;

[tmp = (deference address of x) = actual x = 42] 

* a = * b;

         int x 
[a (address of x)] -> [deference b => actual y => 9] 

* b = tmp;

        int y 
[b (address of y)] -> [tmp => actual x => 42] 

由於swap3(int ** a, int **b)以 「指針指向int」 的(和b)將看起來像內存架構如下:

      int * p 
[a (some address 1)] -> [another address A'] -> [real integer value A''] 

          int * q 
[b (some address 2)] -> [another address B'] -> [real integer value B''] 

所以,當你尊重一個,你實際上得到一個[另一個地址],這就是爲什麼你實際上改變了內存位置而不是實際值。

當你執行INT * TMP = *一個,因爲你在右手邊的尊重一個,現在它的價值將是「另一個地址A`」,內存模式將變爲:

[tmp (another address A')] -> [real integer value A''] 

執行* A = * b,你實際上是這樣,請注意a的價值並沒有改變,只改變存儲它的指向:

       int * p 
[a (some address 1)] -> [another address B'] -> [real integer value B''] 

最後,* b = TMP,也注意到b的值沒有變化:

       int * q 
[b (some address 2)] -> [another address A'] -> [real integer value A''] 
+0

請注意,當您忙於回答以前的版本時,問題已經演變。看起來'swap2()'引起混亂,更不用說'swap3()'。 – 2014-09-21 23:46:45

+0

我其實瞭解swap3()。但是我很困惑爲什麼swap2()會在運行後更改x和y的值。 – 2014-09-21 23:55:38

+0

@ user3466964我已更新我的答案。 – 2014-09-22 00:08:03