iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 8
0
自我挑戰組

30 Days 如何把 C 語言偽裝成高階語言 OWO /系列 第 8

Days 8: 重溫指標:雜項:指標宣告、運算符

▌雜項:指標宣告、運算符。


這篇是之前寫草稿多餘的,有關指標的一些基礎知識和特性。
對指標熟悉的可以跳過不看。 (ゝ∀・)


▌指標宣告:

首先介紹一個最重要的符號: * (星號)

宣告定義上,* 可以把資料類型轉為指標類型
例如: 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是常規資料類型)

指標宣告時行為很像常規的資料型態宣告,但又有少許的不同,注意一下。


▌如果要把 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 -> int*

& 在宣告上的定義代表引用類型,這是C++的C語言沒有 = ^ = ,不詳細說明。


而在表達式上,它們的定義/意義不同:
*  為取值運算符
& 為取址運算符

取值運算符,會取出某地址儲存空間變數的值
取址運算符,會取出某變數地址

例如:
*(0x12345678) 代表取出地址為0x12345678上的值
&b 代表 變數 b 的地址。
所以 *(&b) 等價 變數b的值。


技能點得差不多了,

還差 malloc()、calloc()、realloc()、free() 這四個函數,

還有介紹 atexit() 函數。

就可以去垃圾回收(GC)的部分了。


三十天超難捱的,ヽ(・ω・`)。 (´・ω・`)


上一篇
Days 7: 重溫指標:數據、數據類型的本質
下一篇
Days 9: 動態記憶體分配:malloc()、calloc()、realloc()、free(),內存洩露
系列文
30 Days 如何把 C 語言偽裝成高階語言 OWO /31

尚未有邦友留言

立即登入留言