▌雜項:指標宣告、運算符。
這篇是之前寫草稿多餘的,有關指標的一些基礎知識和特性。
對指標熟悉的可以跳過不看。 (ゝ∀・)
對指標熟悉的可以跳過不看。 (ゝ∀・)
▌指標宣告:
首先介紹一個最重要的符號: * (星號)
從宣告定義上,* 可以把資料類型轉為指標類型。
例如: void -> void*
int -> int*
double -> double*
某結構 -> 某結構* (結構也是資料類型)
類型為指標類型的變數稱為指標。
任何指標類型的指標所佔的空間大小都是 4 byte。
而這 4 個 byte 都是用來儲存地址用的。
—
看待指標宣告時有兩種看法,請看以下例子:
int* a, b;
int *a, b;
以上兩種宣告行為上並無分別。
一種是視 int*
為一體,視int*
是一種新的資料類型,
而事實上的確也是如此,因為a
變數的類型為int*
。
而另一種是視 *a
為一體,認為是*
令a
的資料類型變化為指標類型,
事實上也沒有錯,注意這裏b
變數的類型為int
而並非int*
。
即 a -> int* , b -> int 。(a是指標類型,b是常規資料類型)
指標宣告時行為很像常規的資料型態宣告,但又有少許的不同,注意一下。
例如: void -> void*
int -> int*
double -> double*
某結構 -> 某結構* (結構也是資料類型)
而這 4 個 byte 都是用來儲存地址用的。
看待指標宣告時有兩種看法,請看以下例子:
int* a, b;
int *a, b;
int*
為一體,視int*
是一種新的資料類型,而事實上的確也是如此,因為
a
變數的類型為int*
。*a
為一體,認為是*
令a
的資料類型變化為指標類型,事實上也沒有錯,注意這裏
b
變數的類型為int
而並非int*
。▌如果要把 a, b 都宣告為指標類型可以用以下做法:
int *a, *b;
或者 把int*
改一個別名,封裝為新的資料形態。
typedef int* Intptr
Intptr a, b;
還有
typeof(int*) a, b;
注意 #define 衹是純粹的文字替換,
不能夠像 typedef 一樣把int*
作為資料形態進行識別。
所以:
#define Intptr int*
Intptr a, b; // a -> int* , b -> int //不對
是不對的。
int *a, *b;
int*
改一個別名,封裝為新的資料形態。typedef int* Intptr
Intptr a, b;
typeof(int*) a, b;
不能夠像 typedef 一樣把
int*
作為資料形態進行識別。所以:
#define Intptr int*
Intptr a, b; // a -> int* , b -> int //不對
▌指標宣告、運算符:
有兩個有關指標的運算符:* 和 & 。
* 在宣告上的定義已經介紹過,
* 可以把資料類型轉為指標類型,
如: int -> int*
& 在宣告上的定義代表引用類型,這是C++的,C語言中沒有 = ^ = ,不詳細說明。
而在表達式上,它們的定義/意義不同:
* 為取值運算符。
& 為取址運算符。
取值運算符,會取出某地址上儲存空間的變數的值。
取址運算符,會取出某變數的地址。
例如:
*(0x12345678) 代表取出地址為0x12345678上的值
&b 代表 變數 b 的地址。
所以 *(&b) 等價 變數b的值。
* 可以把資料類型轉為指標類型,
如: int -> int*
* 為取值運算符。
& 為取址運算符。
取址運算符,會取出某變數的地址。
*(0x12345678) 代表取出地址為0x12345678上的值
&b 代表 變數 b 的地址。
所以 *(&b) 等價 變數b的值。
0 Comments
發佈留言