什麼是指標(pointer)
值為變數、陣列元素、函式等所在記憶體位址的變數。C語言以 int *p 的方式宣告,以 &x 取出 x 的位址,以 *p 讀寫 p 所指向的值。指標加上整數時,會以所指向型別的大小為單位前進。陣列名稱在多數運算式中會轉換成指向第一個元素的指標,a[i] 與 *(a + i) 意義相同。表示不指向任何地方的值稱為 NULL 指標。
日文名稱: ポインタ
「指標(pointer)」出現在1領域的13道練習題中(C語言基礎等)。
這個名詞所屬的領域: C語言基礎
值為變數、陣列元素、函式等所在記憶體位址的變數。C語言以 int *p 的方式宣告,以 &x 取出 x 的位址,以 *p 讀寫 p 所指向的值。指標加上整數時,會以所指向型別的大小為單位前進。陣列名稱在多數運算式中會轉換成指向第一個元素的指標,a[i] 與 *(a + i) 意義相同。表示不指向任何地方的值稱為 NULL 指標。
日文名稱: ポインタ
「指標(pointer)」出現在1領域的13道練習題中(C語言基礎等)。
這個名詞所屬的領域: C語言基礎
int *p; 宣告了「指向 int 的指標」p。以 p = &x; 放入變數 x 的位址後,*p = 5; 就會把5寫入 x。函式的引數是傳值,若要在函式中改變呼叫端的變數,就把它的位址當作指標傳入。透過指向結構的指標使用成員時,(*p).m 可寫成 p->m。
指向 int 的指標 p 加1時,位址不是前進1位元組,而是前進 sizeof(int) 位元組(許多環境為4位元組)。陣列名稱除了作為 sizeof 或 & 的對象等情況外,會轉換成指向第一個元素的指標。因此把陣列傳給函式時,實際上只傳了第一個元素的位址,在函式中用 sizeof 無法得知整個陣列的大小。
在微控制器上,會像 (volatile uint32_t *)0x40020014 這樣把整數位址轉換成指標,來讀寫周邊電路的暫存器。透過未初始化的指標、NULL 指標,或指向已釋放區域的懸置指標進行讀寫是未定義行為,在沒有作業系統的環境中可能在不知不覺中破壞其他資料。
在許多64位元環境中是8位元組,在32位元的微控制器上是4位元組。無論指向 char 還是 double,資料指標的大小一般相同。指標不一定與 int 一樣大,因此要把位址存入整數時,使用 stdint.h 的 uintptr_t。
const char *p 是「指向 const char 的指標」,不能透過 p 改寫字元,但 p 本身可以改指其他位址。char *const p 是「指標本身為 const」,p 不能改變,但所指向的內容可以改寫。可以這樣讀:const 在 * 的左邊時固定所指向的內容,在右邊時固定指標本身。
指標加上整數時,會以所指向型別的大小為單位前進。
int 為4位元組,指標為8位元組。指向 int 的指標 p 的值(位址)為 0x1000 時,p + 3 的值為下列…即使把函式的參數寫成 int a[10],參數也不是陣列,而是被當作指向 int 的指標(int *a),f(b) 只會傳入陣列第一個元素的位址。
int 為4位元組,指標為8位元組。執行上方程式時的輸出,下列何者正確?指向生命週期已結束之區域的指標稱為懸置指標,透過它讀寫是未定義行為。
關於上方函式 make 所回傳的指標,下列何者正確?參考 NULL 指標是未定義行為,會發生什麼事標準並未規定。
C語言中,參考 NULL 指標(p 為 NULL 時讀取 *p)時的說明,下列何者正確?即使在64位元的Linux或Windows上,int 一般仍是32位元,變成64位元的是指標。
C語言的標準中,關於 int 型別的大小有何規定?下列何者正確?