(C) 簡單搞懂指標(pointer)、指標陣列(pointers of array, int *foo ...

文章推薦指數: 80 %
投票人數:10人

指標(pointer)就是一個變數的記憶體的地址,在宣告的時候使用"*"放在變數型態之後。

他可以被視為一種資料型別的修飾,因此若宣告了一個指標變數時,就代表 ... 跳到主要內容 (C)簡單搞懂指標(pointer)、指標陣列(pointersofarray,int*foo[])與指向陣列的指標(pointertoarray,int(*bar)[]) 取得連結 Facebook Twitter Pinterest 以電子郵件傳送 其他應用程式 3月27,2018 (一)廢話 指標一直以來都是初學者的一個夢魘,有時後就算是老手也不一定會搞清楚,而且不常用的話也容易忘記,但指標在C理面是一個非常重要的核心技術,在很多公司的面試題都是必出的主題,因此能搞清楚指標對一個工程師而言是百利無一害的。

(二)前言 在開始之前,我必須先強調以下看似廢話但其實是很重要的觀念,之後會提到他們是多麼重要,反正就先記起來吧,就算知道了也還是多想他一下。

什麼"資料型態(datatype)"就存什麼樣的"型態資料"。

因此指標變數就是存記憶體位址 真的很廢話,但在指標裡面會是很重要的觀念。

(三)什麼是指標 指標(pointer)就是一個變數的記憶體的地址,在宣告的時候使用"*"放在變數型態之後。

他可以被視為一種資料型別的修飾,因此若宣告了一個指標變數時,就代表其資料型態是指標類型,因此這個變數存的內容就是記憶體,不管他本身原本是什麼型態,只要在程式理面使用該變數(不額外加符號),就是使用他的記憶體。

就是上面強調的「什麼型態存什麼資料」。

(四)基本符號 在指標裡,「*」是一個非常重要的符號,他同時可以是兩種意思,分別是: 1.指標(pointer)-這個符號只有在宣告的時候才會出現,表示該變數是指標型態,其存的內容就是記憶體位址;可以想像成是一個「鎖」。

2.取值運算子(Dereferenceoperator)-在宣告以外時所有出現在變數前的都是這種(當然不包含乘法),表示依照這個變數所存的地址,去取得該記憶體位址理面存的值;可以想像成是把該變數的鎖打開的「鑰匙」。

另外還有一個符號: 「&」:取址運算子(Address-ofoperator)-取得某一變數本身存放的記憶體位址。

(五)宣告與使用 在使用指標之前,如果沒有進行記憶體配置的話,原則上初始值為NULL,要讓程式能動態配置一個記憶體,就必須使用malloc。

在Linuxmanpages中,malloc的原型為以下所示:    void*malloc(size_tsize); 傳入參數僅有一個,就是要配置的記憶體大小(單位為Bytes),要配置時,必須搭配sizeof(型態)乘上要配置的大小才行。

配置成功後,會回傳該長度記憶體的起始位址。

傳回型態為void*,不過指標變數存的就是"記憶體位址",甚麼型態並不是那麼重要,且記憶體的長度受硬體架構所影響,同一個系統下都為固定值,因此只要在宣告時進行轉型就可以繼續使用了。

這就是為什麼malloc前面都會加上(int*)之類的。

//宣告一個int指標變數,其初始值為NULL int*ptr; //配置5個int大小的記憶體位址給ptr,並將第一個位址存進ptr中 ptr=(int*)malloc(sizeof(int)*5); (六)指標與陣列 用到指標的時機,大多都是為了配置動態陣列才會用到,因此我們先來探討兩者之間的差異。

1.一維陣列、指標: 這邊直接對陣列及指標做比較: intsize=2,i; intarr[size]; int*ptr; ptr=&arr;//將ptr指向array //1.記憶體位址 for(i=0;iint*a;returna;   b.回傳一個addressofint(整數一般變數的位址)->inta;return&a;   c.回傳一個intarray(整數型態的陣列)->inta[100];returna;延伸:在知道functionpointer的妙用前,還必須介紹以下兩種功能:1.typedeftypedef是c/c++中的關鍵字,其允許programmer為datatype(資料型態)創造一個全新的名字。

同時也可以為函式創造一個別名,其好處在於若要把function當做一參數傳入另外一fumcti 閱讀完整內容 (C++)別再用dynamicarray與pointer了!趕快學STL的vector與iterator! 4月04,2018 (一)廢話別再用array與pointer?那我不是在自打上一篇的嘴巴嗎?其實並不衝突。

因為在C之下,pointer還是非常重要的,本篇所著重的是C++。

不知道大家在學C++時,老師或書中有沒有教或學到STL(StandardTemplateLibrary)呢?STL是C++下非常非常好用的函式庫,他提供了非常多Template形式的"容器",讓開發上省去不少麻煩,且使得C++與C之間相去越遠,兩者已經儼然是不同的語言了!(Jserv大師也曾說過-自1999年制訂的C99規格開始,C語言和C++程式語言就分道揚鑣,換言之「C++是C語言的超集(super-set)」不再成立。

)(二)前言C++之父-BjarneStroustrup曾說過,"youshouldusevectoroverArrayunlessyouhaveareallygoodreasontouseanarray"。

因為記憶體的管理永遠是開發者的痛,在現今的程式開發中最好能避免使用new,因為這會使我們必須持續的追蹤其大小且須手動刪除釋放。

尤其是在re-sizearray時,vector會更加好用。

當然不諱言的是,dynamicarray的速度還是優於vector的,只是那是只在極端講求速度的class的內部實作中才使用。

(三)Vector與Iterator是何物?Vector是C++中STL容器(container)中其中一個templateclass,他在宣告後就可以使用。

只需要一直進行新增資料,而不用在乎其大小,亦可視為會自動擴展容量(capacity)的陣列,所以只要一直塞一直塞一直塞就可以了XD。

是C++標準程式庫中的眾多容器(container)之一。

Iterator有時又稱cursor,是一種在很多程式語言中都有的interface,主要功能就是讓工程師可以無需關心memory分配而在各種container中進行尋訪。

C++雖然本身不具此功能,但在STL中對於此進行了實作。

會綁定所指向的容器。

因此Iterator可以視為容器(在這就是用於vector)的指標的概念,因此亦可以直接做 閱讀完整內容 Unknown 瀏覽簡介 封存 2018 2 四月 1 三月 1 (C)簡單搞懂指標(pointer)、指標陣列(pointersofarray,int*f... 2017 3 七月 1 四月 1 三月 1 2016 3 十月 3 顯示更多 顯示較少 標籤 --secure-file-priv 匯入慢 cpuaffinity file intpthread_getaffinity_np linux LOADDATAINFILE MySQL netstat priv proc/net pthread_setaffinity_np sched_getaffinity sched_setaffinity secure 顯示更多 顯示較少 檢舉濫用情形



請為這篇文章評分?