2012-03-05 48 views
1

當x是一個L值(比方說,一個變量),那麼下面的身份成立:參考/解引用標識

X == *(& X)

這很容易解釋,因爲& x是一個指向x的指針,並且應用於& x的解引用運算符*當然會返回x。

現在我想知道如果反面是有道理的。要精確我想知道如果

p == &(* P)

當p是一個非懸掛指針。 這似乎是有道理的,因爲* p本身就是一個L值(具有地址的值),因爲我們已經有指針(=地址)p了。所以你只需要知道,這樣的指針是獨一無二的,因爲然後&(* p)沒有其他機會是p。

因此,當兩個身份都是真實的,你可以說,在數學上,*和&是相互反函數。

我正確嗎?這個所謂的規則有沒有可能的例外?

+1

如果'p'不是指針,則不能執行'&(* p)'。 – karlphillip 2012-03-05 20:18:10

+0

...但問題已經說明,「當p是一個非懸掛指針。」 – 2012-03-05 20:23:31

+0

也許「伴侶仿函數」會比「逆函數」更好一些,因爲它們都運行在不同類型的東西上。 – 2012-03-05 20:27:59

回答

3

p是對象指針時,&*p相當於p。不會出現*p的評估,這由C標準保證。

char *q, *p = NULL; 
q = &*p; // equivalent to q = p; 

下面是標準的相關段落:

(C99,6.5.3.2p3)「如果操作數是一元*運算符,既沒有運營商的結果,也不是&操作被評估並且結果就好像兩個都被省略了,除了操作符上的約束仍然適用並且結果不是左值。「

編輯:後@ ldav1s評論,我改變了字指針對象的指針。事實上,如果pvoid *類型,那麼&*p是無效的。有關信息,C委員會在缺陷報告#102中討論過:http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_012.html

+0

+1。但是'p'不能是'void *',因爲不允許解引用'void *'。 – ldav1s 2012-03-05 20:31:03

+0

@ ldav1s同意,'p'不能是'void *'我編輯了*對象指針*而不是*指針*的答案。 – ouah 2012-03-05 20:37:57

+0

非常好的答案。我覺得有趣的是,* p本身不是L值,所以你不能做類似於q = &(&*p);但是q =&p;沒問題。可能這背後的理由是,至少在理論上* p可能是p背後價值的副本,所以這個副本的地址與p本身不同?或者我是否過度並且沒有任何意義? – Anthales 2012-03-05 21:44:01