發表文章

目前顯示的是 2018的文章

(C++) 別再用dynamic array與pointer了! 趕快學STL的vector與iterator!

圖片
(一) 廢話 別再用array與pointer?那我不是在自打上一篇的嘴巴嗎? 其實並不衝突。因為在C之下,pointer還是非常重要的,本篇所著重的是C++。 不知道大家在學C++時,老師或書中有沒有教或學到STL(Standard Template Library)呢? STL是C++下非常非常好用的函式庫,他提供了非常多Template形式的"容器",讓開發上省去不少麻煩,且使得C++與C之間相去越遠,兩者已經儼然是不同的語言了!(Jserv 大師也曾說過 - 自 1999 年制訂的 C99 規格開始,C 語言和 C++ 程式語言就分道揚鑣,換言之「C++ 是 C 語言的超集 (super-set)」不再成立。) (二)前言 C++之父-Bjarne Stroustrup曾說過, "you should use vector over Array unless you have a really good reason to use an array"。因為記憶體的管理永遠是開發者的痛,在現今的程式開發中最好能避免使用new,因為這會使我們必須持續的追蹤其大小且須手動刪除釋放。尤其是在re-size array時,vector會更加好用。 當然不諱言的是,dynamic array的速度還是優於vector的,只是那是只在極端講求速度的class 的內部實作中才使用。 (三) Vector與Iterator是何物? Vector 是 C++中STL容器(container)中其中一個 template class,他在宣告後就可以使用。只需要一直進行新增資料,而不用在乎其大小,亦可視為會 自動擴展容量(capacity) 的陣列,所以只要一直塞一直塞一直塞就可以了XD。是C++標準程式庫中的眾多容器(container)之一。 Iterator有時又稱cursor,是一種在很多程式語言中都有的interface,主要功能就是讓工程師可以無需關心memory分配而在各種container中進行尋訪。C++雖然本身不具此功能,但在STL中對於此進行了實作。會 綁定所指向的容器 。因此Iterator可以 視為容器(在這就是用於vector)的指標的概念,因此亦可以直接做

(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