C語言指標
其實想了好久,很糾結要不要寫一篇關於C語言指標的文章,我很擔心自己把它講得不清楚,眾所周知C語言程式設計的魅力正是指標,難度也在指標,很多接觸很久的C語言都不能說精通他,但是今天我決定嘗試一下把C語言的指標儘可能地去講清楚,篇幅可能有一點長,希望你耐心看完,有不足的地方可以共同探討。
首先我們先記住一個概念:指標也是一個變數,只是這個變數的值比較特殊,它存放的是地址;
指標和記憶體
我們結合一個例子來講指標:
int *p;
在這裡我們定義了一個指標p,但是現在沒沒有對它進行初始化,在C語言中編譯過程中這條語句會給p開闢一塊記憶體空間,空間大小呢由型別決定在32位系統上int 為四個位元組,所以現在就為p變數開闢了大小為4個位元組的空間,並且限定了這4個位元組裡面只能存放某個記憶體的地址(什麼意思?就是說申請的空間只能存放地址,而不是具體數值),即使你存入別的任何資料都將會被當做地址處理,而且申請的這個記憶體地址開始連續的4個位元組上只能存某個int型別的資料。
int *p //p只能存放int型別的地址
char *p //p只能存放cahr 型別的地址
float *p //p只能存放float型別的地址
這樣看理解了麼?
也就是說你宣告一個指標的時候:申請的型別是什麼型別他就是什麼型別的指標。
給你舉個例子:
int a;
a=10.12345;
printf("a=%d\n",a);
你覺得a打印出來的值是多少?最開始宣告的型別是整型,你給他一個浮點型的資料,他也只會當做整型去處理,結果輸出來的是10.指標變數也是也一樣的,申請的時候是什麼型別,最好就給他什麼樣的型別地址,否則可能不會打到你預期的效果。
指標的使用
我們來看一下面的程式碼:
int a=10;
int *p;
p=&a;
printf("a=%d p=%d",a,*p);
&符號為取地址符:&a就是取a的地址;
這裡我們把a的地址賦給指標變數p,我們可以理解現在指標變數p裡面存放的是a的地址(p指標指向a的地址)那我們現在我們就有兩種辦法可以得到我們的資料10;
一個是變數名:a 另外一個就是指標p,星號p(*p)的意思是把指標p裡面的值取出來,那麼我們都知道現在p裡面存放的是a的地址程式取值的時候直接根據地址去記憶體裡面把值取出來。
舉一個例子:圖書館裡面有一排排書架存放著很多書籍,這時候老師叫你去圖書館拿書,但是怕你忘記了,然後他給你一個寫了一張紙條上面寫著“2號書架第3本”,然後你就拿著紙條去圖書館找到書並且拿回來給你老師,這個過程叫什麼?
這個過程你充當的就是一個指標,手裡拿的紙條就是地址,圖書館書架書架上那本書就是你要讀取的資料。
什麼叫型別不一致,你老師最開始叫你去圖書館取書,但是你拿著紙條去藥店,藥店也是貨架,結果你拿到了2號架子上第3個藥,雖然你也是拿到東西了,但是是你老師想要的麼?
總結一下:
1、指標也是變數。
2、指標裡面放的是地址;(你把哪個變數的地址給他他就存誰的地址)。
3、使用指標時要和宣告的型別一致。
就暫時這樣簡單地說一下指標了吧,等後期對指標有了新的領悟之後會再詳細寫一篇。希望給讀者能夠提出一些自己的看法,你是怎麼理解指標的和我分享一下!