2012-04-02 69 views
1

指針我有需要調用有兩個參數指針的函數的指針交換實現指針在C

int main(void) 
{ ... 
int *ptrp = &p, *ptrq = &q; 
int **ppp = &ptrp, **ppq = &ptrq; 
swap_ptr(ppp,ppq);/* &ptrp, &ptrq passed */ 
/* to swap_ptr() */ 
return 0; 
} 

void swap_ptr(int **ptrA,int **ptrB)... 

我們必須換子Ptrp和PTRQ的值的問題,這是否在指swap_ptr函數我只是使用* ptrA和* ptrB來交換它們,還是它是一些其他的指針語句?

感謝

+0

你在你的問題中有答案,所以我不完全確定它爲什麼需要被問...... – 2012-04-02 05:06:03

+0

你也可以使用[XOR swap](http://en.wikipedia.org/wiki/XOR_swap_algorithm )用於交換指針以及... – 2012-04-02 06:18:37

+0

@ 0x69有趣的事實:如果XOR交換兩個相同的指針,那麼它們都將被設置爲空指針。 – Corbin 2012-04-02 06:55:07

回答

0

是,*ptrA將參考變量ptrpmain*ptrA將參考ptrq。與任何其他類型交換這兩個值,ptrp現在將指向qptrqp

因爲這聽起來可能是作業,我會讓你想出三行代碼。

+0

非常感謝,這就是我需要知道的全部 – nain33 2012-04-02 06:06:37

0

* ptrp指的是指針指向的值。 ptrp指向指針的值(內存位置)

swap_ptr可以簡單地將其中一個值存儲在tmp var中,然後交換這些值。

2

這是相同的概念,作爲交換任何東西:

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

在這種情況下,你只是碰巧交換INT *而不是INT:

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

我是一種新的與這些算法/技術,但我已經想出了這個功能;

function swap(int *p1, int *p2) { 
    *p1 = *p1 + *p2; 
    *p2 = *p1 - *p2; 
    *p1 = *p1 - *p2; 
} 

你可以像這樣測試這個功能;

int a = 10; 
int b = 20; 

printf("%d %d\n", a, b); // 10 20 

swap(&a, &b); 

printf("%d %d\n", a, b); // 20 10 

這裏有一個更好的瞭解一個3步的說明;

  1. *p1 = *p1 + *p2;
    添加從P1(* P1 = 10)P2(* P2 = 20)和存儲上P1結果(* P1 = 30裏的值)
  2. *p2 = *p1 - *p2;
    我們知道另外的結果,通過減去P2(現* P2 = 20)的值P1未來電流值(* P1 =計算P1舊值30)並將結果存儲在p2(計算的* p2 = 10)
  3. *p1 = *p1 - *p2;
    由於P1的值(* P1 = 30)上步驟2沒有改變,我們仍然具有P1P2舊值(* P2 = 10) ,我們可以劃分P2P1和存儲關於P1結果(計算值* P1 = 20)

因此,大家可以看到我們換2 int小號沒有定義任何臨時變量,使傳遞通過引用函數調用。

的傳遞通過引用的原因是最小化存儲器的使用。因爲每次傳值調用都會在內存中分配新的變量(要被GC刪除或不被刪除)取決於你傳遞給函數的參數。

+0

-1這是一種交換值的非常危險的方式,正如http://stackoverflow.com/questions/20753278/swapping-2-pointers-with-inline-assembly中所述 – 2013-12-24 01:36:57

+0

@JoeHass爲什麼危險?正如您在Update 1中看到的那樣,int的最大值沒有任何問題。什麼是導致'swap()'函數危險情況的原因? – ozanmuyes 2013-12-24 02:03:06

+0

你證明了它會** **一次**,這與證明它總是**工作有很大的不同。您是否檢查過C語言標準對於有符號整數溢出時會發生什麼的說法? – 2013-12-24 02:19:07