簡體   English   中英

變量尋址

[英]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 = &ap = &a代替,其中&是地址運算符。 永遠不要嘗試取消引用未初始化的指針! 您最終將在幾乎任意位置上接觸內存,這可能會導致分段錯誤(導致崩潰)或開始覆蓋程序中的其他數據(導致晦澀和不可復制的錯誤)。

當您運行示例代碼時, p&a具有不同的值,恰恰是因為從未分配p指向a的地址。 關於為什么您可能會在p中獲得任何非零值的一些簡短背景知識:局部變量是從稱為的內存的特殊區域分配的,該區域還存儲有關函數調用和返回地址的信息。 每個進程都有自己的堆棧。 但至關重要的是,堆棧的未使用區域並沒有真正被清零或在使用之前進行清理(可能在調試版本中例外,調試版本往往將非常明顯的值(如0xCCCCCCCC0xBAADF00D給未初始化的指針))。 如果你的編譯器不會自動為您設置的默認值(和一般的釋放建立不會有這樣的自動初始化,對於效率的緣故),你所看到的在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會產生錯誤,因為pint* ,而aint 將其視為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM