C C 中取位址符 的語義

2021-04-18 03:03:58 字數 1240 閱讀 9956

在c語言中,&符號大家一定很熟悉吧。

它除了可以作為按位運算「與」之外還有更常用的功能——取變數位址。

我們首先看下面乙個簡單的例子:

#include 

int main(void)

上面**中,指標p指向變數a的位址。在c/c++中,每個變數都有其相應的位址,通過在變數識別符號前加&符號即可獲得變數的位址。

那麼我們這麼寫可以嗎?int *p = &0x01000;

這顯然不行。因為對於乙個數值常量,它是沒有位址的。而變數之所以有位址就是因為要有乙個儲存單元對變數進行標識(當然,變數也可以直接對映到某個暫存器)。

我們再看下面的**:

#include "stdio.h"

int main(void) 

上面**又是怎麼回事呢?

先前已經調查過變數a的位址——0x0012ff60,那麼這裡的指標p實際上也是指向變數a的位址。

首先,將0x0012ff60作為int*,這時它與&a是等價的。

然後*(int*)0x0012ff60表示取變數a的內容。

最後,&*(int*)0x0012ff60表示再脫去*(int*)0x0012ff60的解引用,相當於又變為(int*)&a。

因此,這裡的&與第乙個例子中的&是不同的語義。這裡的&不是取位址,因為乙個*(int*)0x0012ff60不是變數,它是沒有位址的。每乙個變數識別符號在編譯期間,編譯器會為它們建立乙個符號表,其中存放著變數識別符號相應的各種屬性,如型別、位址標識等。位址標識在連線後即可確定邏輯位址值。簡而言之,&作為取位址操作,當且僅當&後面跟著的是變數或函式識別符號。所以這裡的&表示脫去解引用。

由此我們可以得出:&作為取位址操作時,其行為結果是在編譯時就被確定的;而*,解引用操作(或取內容)操作,其行為結果只能在執行時才可被確定。

再看下面的例子,加深印象:

#include "stdio.h"

int main(void)

不過,&符號不象解引用*能用多次,它只能放在變數識別符號或一次解引用前。下面舉乙個例子

int main(void)

由於經過一次&來脫去解引用之後,當前表示式就不為左值。而&必須放在乙個左值前,因為只有左值才能確保引用是有效的,呵呵。

在c++中,&還可以表示引用,這個就不多說了。

#include "iostream"

using

namespace std;

int main(void)

C C 中取位址符 的語義和static變數

c中變數的儲存方式 1.函式中的區域性變數如不作專門說明,都之auto的,即動態儲存的,auto可以省略。區域性變數也可以定義為static的,這時它在函式內值是不變的 2.靜態區域性變數如不賦初值,編譯時系統自動賦值為0,動態區域性變數如不賦初值,則它的值是個不確定的值 3。c規定,只有在定義全域...

C 中的取位址符

這個符號特別容易混淆,因為在c 中,有兩種不同用法 獲得變數位址 引用傳遞 第乙個例子,int main 0x7ffd05129510 hello finished in 0.2s 例子中,變數p使用 宣告為指標,將變數s的位址通過 符號賦值給p.int main hello hello new h...

c c 對陣列取位址

沒怎麼用過c c 今天偶然碰到乙個問題,記錄一下。int a 3 cout a endl cout a 輸出的結果一樣嗎?答案是一樣,不一樣我也不用寫了。初看起來有點奇怪,因為陣列名是指標,那直覺上 a應該是對a這個指標變數取位址,所以結果應該是不一樣,這是為什麼?原來實際上,a是指向a 0 的指標...