發表文章

目前顯示的是 3月, 2018的文章

(C) 簡單搞懂指標(pointer)、指標陣列(pointers of array, int *foo[]) 與指向陣列的指標 (pointer to array, int (*bar)[])

圖片
(一) 廢話 指標一直以來都是初學者的一個夢魘,有時後就算是老手也不一定會搞清楚,而且不常用的話也容易忘記,但指標在C理面是一個非常重要的核心技術,在很多公司的面試題都是必出的主題,因此能搞清楚指標對一個工程師而言是百利無一害的。 (二) 前言 在開始之前,我必須先強調以下看似廢話但其實是很重要的觀念,之後會提到他們是多麼重要,反正就先記起來吧,就算知道了也還是多想他一下。 什麼"資料型態(data type)"就存什麼樣的"型態資料"。因此指標變數就是存記憶體位址 真的很廢話,但在指標裡面會是很重要的觀念。 (三) 什麼是指標 指標(pointer)就是一個變數的 記憶體的地址,在宣告的時候使用" * "放在變數型態之後。他可以被視為一種資料型別的修飾,因此若宣告了一個指標變數時,就代表 其資料型態是指標類型,因此這個變數存的內容就是記憶體 ,不管他本身原本是什麼型態,只要在程式理面使用該變數(不額外加符號),就是使用他的記憶體。就是上面強調的「 什麼型態存什麼資料 」。 (四) 基本符號 在指標裡,「 * 」是一個非常重要的符號,他同時可以是兩種意思,分別是: 1. 指標(pointer) - 這個符號 只有在宣告的時候 才會出現,表示該變數是 指標型態 ,其存的內容就是記憶體位址;可以想像成是一個「 鎖 」。 2. 取 值 運算子(Dereference operator) - 在 宣告以外時所有 出現在變數前的都是這種(當然不包含乘法),表示依照這個變數所存的地址,去取得該記憶體位址理面存的值;可以想像成是把該變數的鎖打開的「 鑰匙 」。 另外還有一個符號: 「 & 」 : 取 址 運算子(Address-of operator) - 取得某一變數本身存放的記憶體位址。 (五) 宣告與使用 在使用指標之前,如果沒有進行記憶體配置的話,原則上初始值為NULL,要讓程式能動態配置一個記憶體,就必須使用 malloc 。 在Linux man pages中,malloc 的原型為以下所示:     void *malloc(size_t size ); 傳入參數僅有一個,就是要配置的記憶體大小(單位為Bytes