天天看點

學習C語言-學習指針

假設一下

cpu使用的變量是存儲在ram裡面的,要問我ram是啥,ram就是個晶片.

你隻需要知道cpu是通過導線和ram晶片連接配接的,然後可以通過導線往ram晶片裡面存儲資料和讀資料.

首先呢ram需要有個一開始的位址,假設是下面的0x20000000  ,要問我為啥要規定位址.

隻有規定了位址cpu才好對資料進行存儲,要是沒有位址,瞎幾把存,瞎幾把取......

學習C語言-學習指針

定義一個變量,然後列印下這個變量存儲的位址

1.定義了一個int型的變量,通過列印可以看到這個變量存儲的位址是 0x20000000

&{變量名字}   :代表取出來這個變量的位址

學習C語言-學習指針
學習C語言-學習指針

2.再定義一個變量

通過列印可以看到這個變量存儲的位址是 0x20000004

學習C語言-學習指針
學習C語言-學習指針

3.定義的兩個變量在記憶體裡面是下面這樣子

0x200000000位址裡面存儲的是 1

0x200000004位址裡面存儲的是 5

學習C語言-學習指針

定義一個指針變量,然後給指針變量指派

定義指針呢其實和定義變量一樣一樣的,隻不過呢變量名子前頭有個*

下面就定義了一個int型的指針變量,變量的名字是add

然後有人會問,為啥變量名字前面加個*就是指針了???  答:搞c語言那幫家夥們規定的!

定義指針和定義變量一樣哈,然後可以定義各種類型的.

然後記住一句話:

指針這個變量是存變量的位址的!!!!

是以給指針指派自然是把變量的位址給它.

學習C語言-學習指針
學習C語言-學習指針

一般哈,什麼類型的指針變量就應該指派什麼類型變量的位址

列如再定義個 char 型

學習C語言-學習指針

那些規定c語言的大佬弄出來指針這個玩意有啥用?

1.咱先看使用,感受下指針,然後具體有啥用就自己體會了

前面咱把一個變量的位址指派給了指針了,然後搞c語言的那幫家夥們又規定

*{指針變量名}  :代表了這個指針所指向的變量

啥意思呢?

對照下面的程式 add = &value  , add記錄的就是變量value的位址,  然後 *add 就代表 value

學習C語言-學習指針
學習C語言-學習指針

有人會想,,,,就這??? 這不是多此一舉???

其實我一開始也是這樣想的.......

2.既然*add 就代表 value,那麼 *add = xxxx,不就是相當于 value=xxxx ,

學習C語言-學習指針
學習C語言-學習指針
學習C語言-學習指針

還是沒感覺到指針有啥用!!!,别着急,先把基本的知識點學完哈

沒有最基本的知識儲備是不可以的,因為厚積而薄發!

見過傳回值是指針的函數沒?(現在就見了)

1.先看一下,如果感覺不了解就接着往下看

學習C語言-學習指針
學習C語言-學習指針

很多人用過傳回值是int char 等等的函數,但是在int char 後面加個 *估計對于初學者沒有用過

看下面的哈,  其實就是指針之間指派.下面就是把  aaa(int *類型的指針) 代表的位址指派給 add

變量之間可以互相指派吧,指針之間也一樣,可以互相之間指派.

其實和上面是一樣的道理,那個函數function傳回值是一個 int * 類型的指針,  然後指派給了  add而已

學習C語言-學習指針
學習C語言-學習指針

姑且再問一句,函數名字是啥?

1.咱們都知道這樣調用函數

學習C語言-學習指針
學習C語言-學習指針

2.這樣的見過沒

學習C語言-學習指針
學習C語言-學習指針

3.先記住一句話:

函數名就是這個函數的位址!

既然是位址,那麼這個位址應該可以指派給一個指針.

因為是函數的位址,是以咱定義的指針也一定是一個函數類型的.

上面的函數 void function()  是一個沒有傳回值,沒有形參的函數

那麼咱需要定義一個這種的指針類型

其實就是  void (*指針變量名字,随意寫) () 

我上面寫的是 void (*fun)();

fun 呢就是一個函數類型的指針, 是一個沒有傳回值,沒有形參的函數指針

 咱可以把這種函數指派給這個指針變量  就是上面的  fun = function

那麼這個函數指針便代表了那個函數  fun 就等同于 function

是以調用 fun(); 就等同于調用 function()

4.如果函數有形參怎麼辦? 好辦,他有咱就加

學習C語言-學習指針
學習C語言-學習指針

5.如果函數有傳回值怎麼辦

學習C語言-學習指針
學習C語言-學習指針

小總結一下

指針呢其實基本的也就是上面那些,指針就是用來記錄變量的位址的

或是做位址之間的傳遞的.  &代表取位址符   *代表取資料

&{變量名}  :就是把這個變量的位址取出來

*{指針變量名} :就是把這個指針所代表的位址裡面的存的值取出來

下面看一些比較常見的應用

把數組的位址指派給指針,然後用指針操作數組

學習C語言-學習指針
學習C語言-學習指針

函數的形參是一個指針

學習C語言-學習指針
學習C語言-學習指針

說下void*

void代表任意資料類型,是以void* xxx 就代表定義了一個任意類型的指針

void* 一般出現在函數形參裡面使用

列如下面的例子

其它類型給void是不需要轉換的,因為void接收任意類型嘛.

是以 function(&value); 裡面直接 &value

學習C語言-學習指針
學習C語言-學習指針

int valu = *(int *)data;

後面的 (int *)data 是先把這個資料類型強制轉換為 int的指針類型

然後組合前面的 * 就是取出來資料

然後指派給 valu

結語

以上的指針的基本知識多練習幾遍就可以.

指針真正的應用是在于代碼的封裝.

可能對于初學者感受不到其作用,但是當你成為真正的開發人員

你會發現把好多功能函數封裝起來,然後留出接口來調用

是以後必不可少的.

封裝的時候會大量的使用指針!函數指針,結構體指針等

怎麼說呢!90%的程式員敲的是字母,寫的是代碼!

當你開始封裝的時候,你寫的便是思想!

但是需要一定的基礎知識儲備才能達到!

繼續閱讀