C指標亂談(1)

2022-03-04 18:42:49 字數 2379 閱讀 1341

寫了幾年的c指標幾乎沒怎麼用過,因為感覺沒什麼用。不過在聽了一位老師講課之後,我改變的我的想法。

在此稍做總結,希望能幫到一些和我有同樣想法的人,希望看完這篇文章後能改變您的想法。

首先,說說概念,指標是什麼?基本的作用是什麼?

有了這個概念,我們繼續向下看。

指標的宣告:             

1

char* 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 typedef 

struct

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 typedef 

struct

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...