2016-04-19 59 views
0

普通指針用法我在一本書在讀如下:指針是否可以指向某個值,指針值是否指向該地址?

int *pointer; 
int number = 5; 
pointer = &number; 

然後*指針有5 值,但各地做這項工作的其他方式?我的意思是:

int *pointer; 
int number = 5; 
*pointer = &number; 

這裏指針是否包含值5,*指針是否包含數字的地址?

謝謝。

+3

不,它調用未定義的行爲。 –

+1

你可能想要指針的指針。 – songyuanyao

回答

2

打個比方:

您使用指針很多次,每天,甚至沒有考慮它。

指針是一個間接 - 它會告訴你哪裏東西是,或者它如何能夠達成,但不是什麼那個東西。
(在類型化的語言,你就可以知道它是什麼種事情,但那是另一回事。)

考慮,例如,電話號碼。

這些告訴你如何聯繫電話號碼所屬的人。
隨着時間的推移,這個人可能會改變 - 也許有人沒有支付他們的賬單,數量被重新分配 - 但只要這個數字是有效的,你可以用它來接觸一個人。

使用這個比喻,我們可以定義以下操作:

  • &person給你一個人的電話號碼,並
  • *number給你的號碼屬於個人。

一些規則:

  • 只有兩個在這個語言類型 - 人員和電話號碼。
  • 只有人可以有電話號碼; &number是一個錯誤,因爲是*person
  • 未指定的電話號碼到達總經理Acme公司客戶服務的公司

現在,你的第一個例子將轉化

PhoneNumber n; 
Person Bob; 
n = &Bob; 

這是有道理的; n現在持有鮑勃的電話號碼。

你的第二個例子將轉化

PhoneNumber n; 
Person Bob; 
*n = &Bob; 

它會說,這是沒有意義的「與Bob的電話號碼替代了Acme公司的客戶服務的總經理」。

而你的最後一個問題,

這裏沒有指針包含值5和*指針持有數的地址?

將轉化

是這個電話號碼同樣的事情鮑勃,如果你調用它,將Bob的電話號碼的答案嗎?

我相信你能看到的是一個相當奇怪的問題。

3

int *pointer; 
int number = 5; 
*pointer = &number; 

你從來沒有指定一個有效的地址,以pointer,所以取消引用該指針(如由表達*pointer完成)無效。

2

您的第二種情況將不會編譯,因爲作業*pointer = &number涉及不兼容的類型(左邊的int,右邊的指針爲int),導致分配無效。

如果你以某種方式強制分配到編譯中,那麼pointer不會被初始化。訪問它的值,更不用說對其進行解引用(例如,評估*pointer或將其分配給*pointer = number*pointer = 5)給出未定義的行爲。任何事情都可能發生......依賴於情況,未定義行爲的共同結果是異常程序終止。

2

*pointer = &number;無效C.

*pointerint類型的,並且是&numberint*類型。這不是一種有效的賦值形式,不會在標準C編譯器上編譯。

您可以將數字存儲在指針變量中,但是您必須使用顯式強制轉換來強制進行類型轉換。一些編譯器允許它沒有明確的轉換,但請注意,這樣做是非標準的擴展。

當然,請注意,您還沒有設置pointer指向分配的內存地址,因此您不能在其指向的地方存儲任何東西。

如果你這樣做,如

pointer = &something; 
*pointer = (int)&number; 

則允許C中的顯式類型轉換,但如果你試圖去引用該指針,該行爲是實現定義的。它也可能是未定義的行爲,如果發生錯位等情況,請參閱C11 6.3.2.3:

一個整數可能轉換爲任何指針類型。除了指定之前的 ,結果是實現定義的,可能不是 正確對齊,可能不指向引用的 類型的實體,並且可能是陷阱表示。

+1

TL; DR:只需遠離編寫這樣的廢話代碼就可以開始。 – Lundin

+0

好吧,謝謝!我沒有完全掌握這個主題,所以當時聽起來很正確。 –

1

對於你寫分配x = y,既xy必須是,或可隱式轉換到,同一類型的(或x必須有一個用戶定義的賦值運算符采取匹配的y類型的參數,或者......好吧,有幾種可能性,但你明白了)。

現在,讓我們來看看在聲明

*pointer = &number; 

這裏,*pointer具有類型int& - 你跟着指針得到一個(參考)存儲在該位置的整數。現在讓我們忽略你的指針未初始化並且導致未定義行爲的事實。

右側&number正在指向一個整型變量,因此類型爲int*

所以,表達式根本就沒有任何意義,就類型系統而言:沒有辦法將int*分配給int&。它不是意思是什麼。

讓我們涉及它回到你的問題的英語

這裏沒有指針包含值5和*指針持有數的地址?

直接轉換爲類型系統,因此並不意味着什麼。同樣,我們可以把它分解

  • 確實指針包含值5

    指針包含位置。只有在討論具有字面值的指針(除nullptr之外)的情況下,纔會有意義的平臺上存在衆所周知的地址 - 這很少見,而'5'不太可能是一個知名的地址,形成地址反正

  • *指針指向的地址

    好,還有就是*pointer可容納的地址的情況下 - 這也正是*pointer本身是一個指針,這意味着變量pointer是一個指針對指針如int **。情況並非如此:我們知道您的代碼中的*pointer的類型,它是int&,而不是int*。從牽強的類比部門

1

當你創建一個指針變量時,最初它會有垃圾值(比方說300地址的位置)。因此,當您取消引用指針(* 300)時,它會給出另一個垃圾值(300地址位置處的值)或錯誤(嚴格地說,根據您的計算機可能會發生任何事情)。

在第三步中,& number: - 這也是另一個數字,並且您試圖爲*指針指定一個數字(可能是另一個數字),這是不可能的。 (這是這樣的: - 5 = 6)。因此這將是一個錯誤。

相關問題