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...