一 指標就是位址

2022-05-18 20:49:12 字數 2494 閱讀 1551

首先明確乙個觀點:指標就是位址。這是理解指標的起始一步。

直觀感受下,變數的位址

幾點說明:

%p中的p是pointer(指標)的意思,專門用於列印指標變數中的內容。

有時看到用%x列印指標的,雖然結果一樣,但含義完全不同。%p:用合適的方式(一般是十六進製制)輸出指標變數中存放的另乙個變數的位址;%x:用十六進製制的方式列印出變數的值。並且在我的環境中使用%x列印指標變數的話,會省略前面的0。

指標變數的示意圖

左上角是變數名,右上角是變數位址,中間是變數儲存的內容。

高階指標

如二級指標:指向指標的指標。

由執行結果,畫出記憶體示意圖:

各變數的型別推導,foo_p是指標,且指向int,故foo_p的型別是int*,也就是在'*'前新增int;foo_pp也是指標,且指向foo_p,故foo_pp的型別是int**,也就是在'*'前新增int*。

更高階的指標型別,以此類推。

環境中各基本型別分配的記憶體大小:

在我的環境中,指標型別分配的大小是 sizeof(int*)=4;也就是說用4個位元組的大小來儲存變數的位址,這也是目前大多數環境下的結果。以後討論基於這個結果。至於在c標準中,沒有規定指標型別的大小,具體大小依靠具體的環境。

關於 sizeof

首先必須指出:sizeof是操作符,而不是函式。被誤解為函式,可能是大多數情況下,我們都這樣使用它:sizeof()。其實這樣用 sizeof 型別,如sizeof int也是可以的。

正確的使用是:如果type是型別名,則sizeof(type);如果type是變數,則加不加括號,都可以。

**幾個問題

(1)竟然指標存放的是變數的位址,而在同一環境中位址是同種型別的整數,如4位元組大小的,那為何還有指標型別的說法?

為什麼會出現這種情況,關鍵在於:不同型別的變數有不同的儲存方式。如4位元組的int和同樣4位元組的float,所分配的空間大小一樣,但能夠表示的資料範圍有很大差距。具體儲存方式,大家可查下。

這就說明,在進行解引用時,必須指出相應的型別方式,才可正確獲取變數值。

指標是派生型別,它的型別依靠它所指向的物件。

兩個概念

指標的型別、指標所指向的型別

用例項說明:int *p;

(i)p是指標,它的型別是 int*

(ii)p是指標,它所指向的型別是 int

另乙個例項:int **p;

(i)p是指標,它的型別是 int**(二級指標,它的用法以後會講到)

(ii)p是指標,它所指向的型別是 int*

方法很簡單:是不是指標型別,就看宣告中有沒有*;指標的型別就是去掉變數名後,剩下的部分;指標所指向的型別就是去掉變數名和離它最近的*,剩下的就是。

(2)空指標型別:void*

在ansi c中提供了一種,可以接受任何型別的指標型別:void*(空指標型別)

int foo = 5;

void *p = &foo;   //這句話是不會報錯的

printf("*p...%d\n", *p);   //這句話無法通過編譯

(3)printf()函式

printf(格式控制,輸出表);

功能:按照規定格式輸出指定資料。

「格式控制」是用雙引號括起來的格式控制轉換字串。「輸出表」中的資料可以是合法的常量、變數和表示式,要與「格式控制」中的格式字元一一對應。

幾個格式輸出符

%d —— 以帶符號的十進位制形式輸出整數

%o —— 以無符號的八進位制形式輸出整數

%x —— 以無符號的十六進製制形式輸出整數

%u —— 以無符號的十進位制形式輸出整數

%c —— 以字元形式輸出單個字元

%s —— 輸出字串

%f —— 以小數點形式輸出單、雙精度實數

%e —— 以標準指數形式輸出單、雙精度實數

%g —— 選用輸出寬度較小的格式輸出實數

C 學習一 指標

摘要自 c 指標 菜鳥教程 runoob.com 指標也就是記憶體位址,指標變數是用來存放記憶體位址的變數。所有實際資料型別不管是整型 浮點型 字元型,還是其他的資料型別,對應指標的值的型別都是一樣的,都是乙個代表記憶體位址的長的十六進製制數。唯一不同的是指標所指向的變數或常量的資料型別不同。一 c...

指標與陣列(一) 指標認知

一 定義與初始化 1.如何理解指標?1 指標是變數。2 指標是乙個位址,指向的是個型別。3 指標指向的是位址,位址指向的是內容。4 指標的指標,是面對於指標的變數。5 指標型別的位元組長度由作業系統決定 32位作業系統為4位元組,64位作業系統為8位元組 2.定義指標的幾種規範 int p 重在表示...

指標(一) 指標運算 指標常量,指標變數

指標運算 參見這裡 include using namespace std 輸出 10 20 30 40 50 0x7e17f0 100x7e17f4 20 0x7e17f4 200x7e17f4 21 0x7e17f4 2130 0x7e17f8 3031 0x7e17f8 31 int main...