[英]Variable addressing
int main()
{
int a = 10;
int *p; // int *p = a; gives me an error: invalid conversion from int to int *.
// Tell me why?
*p = a; // while this runs
cout << &a <<" "<<p;
}
其次,&a和p給出2個不同的值。 根據我的說法,a的地址與指針p中存儲的值應該相同嗎?
從字面上看, int *p = a
接受存儲在a
的值 ,並嘗試將其解釋為要存儲在p
的內存地址 。 盡管計算上合法,但是C ++在沒有顯式類型轉換的情況下將不允許這樣做,因為這通常不是您想要執行的操作。
語句int *p = a
與*p = a
不同的原因很簡單:第一個語句,以下簡稱
int *p;
p = a;
正在初始化指針,因此它期望在RHS上有一個內存地址,而第二條語句正在為p
指向的位置分配一個值,因此(在這種情況下)期望在RHS上為整數。
如果要初始化p
使其指向a
,則可以使用int * p = &a
或p = &a
代替,其中&
是地址運算符。 永遠不要嘗試取消引用未初始化的指針! 您最終將在幾乎任意位置上接觸內存,這可能會導致分段錯誤(導致崩潰)或開始覆蓋程序中的其他數據(導致晦澀和不可復制的錯誤)。
當您運行示例代碼時, p
和&a
具有不同的值,恰恰是因為從未分配p
指向a
的地址。 關於為什么您可能會在p
中獲得任何非零值的一些簡短背景知識:局部變量是從稱為棧的內存的特殊區域分配的,該區域還存儲有關函數調用和返回地址的信息。 每個進程都有自己的堆棧。 但至關重要的是,堆棧的未使用區域並沒有真正被清零或在使用之前進行清理(可能在調試版本中例外,調試版本往往將非常明顯的值(如0xCCCCCCCC
或0xBAADF00D
給未初始化的指針))。 如果你的編譯器不會自動為您設置的默認值(和一般的釋放建立不會有這樣的自動初始化,對於效率的緣故),你所看到的在p
是發生了什么事設在分配到內存p
之前你程序設置其堆棧框架。
int *p = a;
用不是指針的a
初始化指針p
(因此發生錯誤),而*p=a;
從句法上講,將a
分配給p
指向的內存。 同樣,前者是初始化 ,而后者是Assignment 。
請注意,在您的情況下, *p=a
調用未定義的行為 ,因為p
並不指向程序的合法內存,即您尚未為p
分配內存。
您將a
存儲在p
指向( *p
)的地址上。 如果要將a
( &a
)的地址存儲在p
,則必須使用
p = &a;
使用int *p = a
會產生錯誤,因為p
是int*
,而a
是int
。 將其視為int* p = a
。
int *p = a;
-這意味着您要聲明一個變量並將其賦值。 變量名是p
和其類型是int *
你assiging值是a
(10),其將被分配給p
。 int *p = a;
相當於
int *p;
p = a;
我們不能將int
值賦給int *
。
*p = a;
-這是您對*p
而不是p
int
。 這樣很好 在執行此操作之前,請不要忘記為p
分配內存,否則可能會導致崩潰(未定義的行為),因為p
可能具有一些垃圾值。
希望您嘗試將a
地址分配給p
。 在這種情況下,您可以執行以下操作。
int a;
int *p = &a;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.