普通指針用法我在一本書在讀如下:指針是否可以指向某個值,指針值是否指向該地址?
int *pointer;
int number = 5;
pointer = &number;
然後*指針有5 值,但各地做這項工作的其他方式?我的意思是:
int *pointer;
int number = 5;
*pointer = &number;
這裏指針是否包含值5,*指針是否包含數字的地址?
謝謝。
普通指針用法我在一本書在讀如下:指針是否可以指向某個值,指針值是否指向該地址?
int *pointer;
int number = 5;
pointer = &number;
然後*指針有5 值,但各地做這項工作的其他方式?我的意思是:
int *pointer;
int number = 5;
*pointer = &number;
這裏指針是否包含值5,*指針是否包含數字的地址?
謝謝。
打個比方:
您使用指針很多次,每天,甚至沒有考慮它。
指針是一個間接 - 它會告訴你哪裏東西是,或者它如何能夠達成,但不是什麼那個東西。
(在類型化的語言,你就可以知道它是什麼種事情,但那是另一回事。)
考慮,例如,電話號碼。
這些告訴你如何聯繫電話號碼所屬的人。
隨着時間的推移,這個人可能會改變 - 也許有人沒有支付他們的賬單,數量被重新分配 - 但只要這個數字是有效的,你可以用它來接觸一個人。
使用這個比喻,我們可以定義以下操作:
&person
給你一個人的電話號碼,並*number
給你的號碼屬於個人。一些規則:
&number
是一個錯誤,因爲是*person
。現在,你的第一個例子將轉化
PhoneNumber n;
Person Bob;
n = &Bob;
這是有道理的; n
現在持有鮑勃的電話號碼。
你的第二個例子將轉化
PhoneNumber n;
Person Bob;
*n = &Bob;
它會說,這是沒有意義的「與Bob的電話號碼替代了Acme公司的客戶服務的總經理」。
而你的最後一個問題,
這裏沒有指針包含值5和*指針持有數的地址?
將轉化
是這個電話號碼同樣的事情鮑勃,如果你調用它,將Bob的電話號碼的答案嗎?
我相信你能看到的是一個相當奇怪的問題。
在
int *pointer;
int number = 5;
*pointer = &number;
你從來沒有指定一個有效的地址,以pointer
,所以取消引用該指針(如由表達*pointer
完成)無效。
您的第二種情況將不會編譯,因爲作業*pointer = &number
涉及不兼容的類型(左邊的int
,右邊的指針爲int
),導致分配無效。
如果你以某種方式強制分配到編譯中,那麼pointer
不會被初始化。訪問它的值,更不用說對其進行解引用(例如,評估*pointer
或將其分配給*pointer = number
或*pointer = 5
)給出未定義的行爲。任何事情都可能發生......依賴於情況,未定義行爲的共同結果是異常程序終止。
*pointer = &number;
無效C.
*pointer
是int
類型的,並且是&number
int*
類型。這不是一種有效的賦值形式,不會在標準C編譯器上編譯。
您可以將數字存儲在指針變量中,但是您必須使用顯式強制轉換來強制進行類型轉換。一些編譯器允許它沒有明確的轉換,但請注意,這樣做是非標準的擴展。
當然,請注意,您還沒有設置pointer
指向分配的內存地址,因此您不能在其指向的地方存儲任何東西。
如果你這樣做,如
pointer = &something;
*pointer = (int)&number;
則允許C中的顯式類型轉換,但如果你試圖去引用該指針,該行爲是實現定義的。它也可能是未定義的行爲,如果發生錯位等情況,請參閱C11 6.3.2.3:
一個整數可能轉換爲任何指針類型。除了指定之前的 ,結果是實現定義的,可能不是 正確對齊,可能不指向引用的 類型的實體,並且可能是陷阱表示。
TL; DR:只需遠離編寫這樣的廢話代碼就可以開始。 – Lundin
好吧,謝謝!我沒有完全掌握這個主題,所以當時聽起來很正確。 –
對於你寫分配x = y
,既x
和y
必須是,或可隱式轉換到,同一類型的(或x
必須有一個用戶定義的賦值運算符采取匹配的y
類型的參數,或者......好吧,有幾種可能性,但你明白了)。
現在,讓我們來看看在聲明
*pointer = &number;
這裏,*pointer
具有類型int&
- 你跟着指針得到一個(參考)存儲在該位置的整數。現在讓我們忽略你的指針未初始化並且導致未定義行爲的事實。
右側&number
正在指向一個整型變量,因此類型爲int*
。
所以,表達式根本就沒有任何意義,就類型系統而言:沒有辦法將int*
分配給int&
。它不是意思是什麼。
讓我們涉及它回到你的問題的英語
這裏沒有指針包含值5和*指針持有數的地址?
直接轉換爲類型系統,因此也並不意味着什麼。同樣,我們可以把它分解
確實指針包含值5
指針包含位置。只有在討論具有字面值的指針(除nullptr
之外)的情況下,纔會有意義的平臺上存在衆所周知的地址 - 這很少見,而'5'不太可能是一個知名的地址,形成地址反正
*指針指向的地址
好,還有就是*pointer
可容納的地址的情況下 - 這也正是*pointer
本身是一個指針,這意味着變量pointer
是一個指針對指針如int **
。情況並非如此:我們知道您的代碼中的*pointer
的類型,它是int&
,而不是int*
。從牽強的類比部門
當你創建一個指針變量時,最初它會有垃圾值(比方說300地址的位置)。因此,當您取消引用指針(* 300)時,它會給出另一個垃圾值(300地址位置處的值)或錯誤(嚴格地說,根據您的計算機可能會發生任何事情)。
在第三步中,& number: - 這也是另一個數字,並且您試圖爲*指針指定一個數字(可能是另一個數字),這是不可能的。 (這是這樣的: - 5 = 6)。因此這將是一個錯誤。
不,它調用未定義的行爲。 –
你可能想要指針的指針。 – songyuanyao