寫了幾年的c指標幾乎沒怎麼用過,因為感覺沒什麼用。不過在聽了一位老師講課之後,我改變的我的想法。
在此稍做總結,希望能幫到一些和我有同樣想法的人,希望看完這篇文章後能改變您的想法。
首先,說說概念,指標是什麼?基本的作用是什麼?
有了這個概念,我們繼續向下看。
指標的宣告:
1char* p; //
這就宣告了乙個char型 的指標,名字叫p
這裡,我要強調一點,這一點十分重要,對理解指標十分有幫助。請注意,我宣告指標時*號是挨著char的且和p之間有乙個空格,
為什麼這麼寫?(雖然我們知道有沒有空格都無所謂,對結果沒影響)這樣寫就是為了明確char*它是乙個整體,它表示的是一種型別!
一旦你這麼看,那麼在很多時候你就不會犯糊塗.比如: 我們在初始化指標的同時為指標賦值,如下
1//形式1
2int a[5]; //
宣告乙個陣列
3char* p = &a[0]; //
將指標指向陣列的第乙個元素4//
形式25
int a[5];6
char*p;
7 p = &a[0];
形式1,和形式2是完全等價的,我們看形式2,就得很清晰,看形式1,就覺得彆扭!原因是,我們認為指標是和位址是對應的,
有的時候甚至認為指標就是位址,所以形式2中將乙個位址賦值給指標,太自然不過了。
但形式1中 char* p = &a[0]; 就讓人感覺位址賦值給了*p,而*p代表的是位址中的值啊!所以看起來彆扭。但是如果按照我之前
的說法「char*它是乙個整體」,你還覺得彆扭嗎?那麼那種別捏的感覺是不是消失了呢?
在此,引出一條經典的結論:
在定義變數用到的符號都不表示運算,而表示是一種型別!
指標,就是乙個很好的例子,char* p = &a[0];是*表示指標型別,而用的時候,如:a[0] = *p, *表示一種操作(將p指向位址的值取出來)
同樣陣列也是這樣:int a[5]; 表示是陣列型別,而用的時候*p = a[0];[0]表示將0位置這個取出來。
指標的宣告拓展:
const data* p;//表明該指標只能用於讀取資料而不用於修改資料
最終結論: 宣告指標時,將型別和*看作乙個整體,它表示一種型別。
上述的只是乙個開場白,接下我們來看一看,指標的好處,讓我們知道,用指標用的有道理。
這裡,我就從結構體指標入手,為什麼從他入手,因為指標在這方面用的比較多(相比,指向陣列的指標就用的比較少,優勢也不大)
在此,提前引入一條經典結論:傳遞結構體變數時,總是傳遞位址,而不是變數本身。
#include typedefstruct
datedate;
void print(data d)
void
main()
,,};
inti;
for(i=0; i>3; i++)
print(a[i]);
//這裡的引數傳的就是結構體變數本身
}
所以data a[3]表示宣告了乙個結構體陣列,(模擬於int a[3],因為data表示乙個型別)感覺就像乙個二維陣列。
當然,這都不是重點,重點是他違背了一句話:傳遞結構體變數時,總是傳遞位址,而不是變數本身。顯然void print(data d)這個函式
傳遞的是變數本身,那麼就意味著系統將為形參d將開闢乙個空間儲存乙個結構體變數,也就是 year,month,day這3個int型變數。如果
結構體比較大,這樣就很浪費記憶體空間了,那如何實現傳遞位址呢?答案就是用結構體指標,不管結構體有多大,我只用開闢乙個指標大小的
空間,這樣是不是節約了空間呢,同時也節省了時間,這種好事何樂而不為呢?具體看如下代買:
#include typedefstruct
datedate;
void print(const data* p)//
同樣data*看成乙個整體
void
main()
,,};
inti;
for(i=0; i>3; i++)
print(&a[i]); //
這裡的引數傳的就是結構體的位址
}
p->year,p->month,p->day表示用指標來訪問結構體變數。也可以寫成:(*p).year,(*p).month,(*p).day,至於為*p打上括號,原因是"."的優先順序(僅次於圓括號)比「*」的優先順序高。
好了,就聊到這吧!希望能幫到閱讀到此的讀者。
亂談 2 不再亂談
累了,不想再寫下去了.有些東西感覺寫的過頭,寫完又刪除了,過猶不及,點到即止,過頭了的東西放網上,誰知道會搞出什麼問題,下一步集中精力做我的下十年去了.幾篇暢想和亂彈,已經打好了最後終結所需的東西,最後完全算是有個交待,給萬一以後有人進來看到,不能浪費了人家的時間和熱情.對於函式式程式設計,感覺自已...
qmake 亂亂亂談 四
繼續qmake,本文主題 低調的 template subdirs 非常非常常用的乙個東西,可是manual中卻介紹的很少,太低調了。在編寫包含多可執行檔案 庫 外掛程式 的程式時,一直不敢相信subdirs的能力,以至於曾一度想轉到cmake之下。manual 中對 template subdir...
qmake 亂亂亂談 二
接前面qmake 亂亂亂談 一 繼續看看qmake。暫定主題 qmake之命令列引數及qmake啟動時載入了什麼東西,或許可以藉此學習一下qmake是處理命令列引數的方法 執行 qmake h 可以得到qmake大部分命令列引數及其說明。本文預計涉及到的引數如下 project 工作於何種模式,pr...