(C) 簡單搞懂指標(pointer)、指標陣列(pointers of array, int *foo ...
文章推薦指數: 80 %
指標(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;i
同時也可以為函式創造一個別名,其好處在於若要把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
顯示更多
顯示較少
檢舉濫用情形
延伸文章資訊
- 1指標與陣列
Part 1 C 程式語言篇. 32. 指標其實就是一位址。陣列的名稱,表示此陣列第一個元素的位址,所. 以它也是指標。由此可知,指標與陣列的關係是很密切的。為了與指標.
- 2重新看懂指標與陣列之間的交互關係
C 語言中,指標與陣列之間的關係一直是一個初學者很難理解的坑。 ... 陣列的變數名稱其實就是一個指標,指向陣列開頭元素的記憶體位置。
- 3C++教學(二十一):指標陣列 - 痞客邦
C++教學(二十一):指標陣列. 指標即然也是變數的一種,有時為了集合資料與處理上的方便,我們也可以使用陣列的方式來管理指標變數,宣告指標陣列的方式 ...
- 4【Day 26】指標介紹(下) - iT 邦幫忙::一起幫忙解決難題
C 語言的簡單入門系列第26 篇 ... 首先,我們先宣告一個指標變數 p 以及長度為10 並已經存放數值的陣列 ... 輸出陣列指標中所存放位址的值.
- 5[C語言]指標、陣列與結構 - HackMD
相較於 基本型別 int, double,C語言還有 衍伸資料型別(Derived datatype) 。 其中很常被應用的,就是 指標(pointer) 、 陣列(Array) 、 結構(st...