指標變數和陣列

2021-08-20 13:17:03 字數 1149 閱讀 7996

int arr[2] = ;

int arr = ;

int i = arr[0];

arr[1] = 23;

char * str = "abc";    //字元內容儲存在堆上

char str1 = ; //字元內容儲存在棧上

第一種情況:字元內容會儲存在堆上,並在棧裡儲存str指標變數,變數值為字元在堆上的首位址。

第二種情況:字元內容會儲存在棧上,但是不會有額外變數儲存字元在堆上的位址,這個位址編譯器知道,只會出現在指令中,但並不會作為資料儲存。

如我們宣告乙個整型變數:int i = 15;。這會在堆疊開闢一塊空間(4個位元組),儲存變數的值(15),但是這個15位於堆疊的記憶體位址卻不會作為資料儲存,那麼我們是怎麼訪問到這個變數的呢:因為變數在堆疊的位址會出現在指令中,並不是從記憶體裡取的,而僅僅是在指令中的,具體看**:

int i = 15;

i = 25;

對應彙編為:

movl  $15, -4(%rbp)

movl $25, -4(%rbp)

#暫存器rbp儲存著剛進入子程式時的堆疊位址,對堆疊變數的訪問都是用rbp的值加上偏移量(常數)來進行的。

所以採用指標變數運算元據比用非指標變數或陣列名要慢,前者需要至少兩條彙編指令,後者只需要一條。

int arr[2] = ;

int*p = arr; //等效於 int

*p = &arr[0];

//以下是等效操作:

int t;

t = *arr

t = *(arr+0)

t = arr[0]

t = *p

t = *(p+0)

t = p[0]

陣列名和指標變數的不同點

p++   //指標變數會變化,等同於:p = &p[1]

arr++ //編譯器會報錯

arr++之所以會報錯,是因為arr的值只會出現在指令中(表現為暫存器rbp的值加偏移量常數),並沒儲存在記憶體裡,所以無法改變。

sizeof用法,指標變數和陣列變數

指標變數的sizeof 學過 資料結構的你應該知道 指標是乙個很重要的概念,它記錄了另乙個物件的位址。既然是來存放位址的,那麼它當然等於計算機內部 位址匯流排的寬度。所以在32位計算機中,乙個 指標變數的返回值必定是4 注意結果是以 位元組為單位 可以預計,在將來的 64位系統中指標變數的sizeo...

指標陣列和陣列指標

有關陣列指標和指標陣列容易混淆,本文舉例說明兩者的區別,並加以分析。基本概念 指標 inta 1 int p a 指標的指標 int p2p p 簡單陣列 intb 20 指標陣列 int p 10 指標陣列,含有10個指標元素,即每乙個元素都是乙個指標 陣列指標 int p 10 這個指標用來指向...

指標陣列和陣列指標

理解這兩個概念,當從語言學的語法角度開始,定語 名詞,即 的 語句。指標陣列 指標的陣列 陣列指標 陣列的指標。一 指標陣列 元素為指標的陣列 顧名思義,就是說的首先是乙個陣列吧,然後陣列的元素是指標而已。說明形式為 type pointer array constant1 constant2 co...