學習C語言-學習指針


<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/LearnC" frameborder="0" scrolling="auto" width="100%" height="500"></iframe></p>

 

假設一下

CPU使用的變量是存儲在RAM里面的,要問我RAM是啥,RAM就是個芯片.

你只需要知道CPU是通過導線和RAM芯片連接的,然后可以通過導線往RAM芯片里面存儲數據和讀數據.

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

只有規定了地址CPU才好對數據進行存儲,要是沒有地址,瞎幾把存,瞎幾把取......

 

 

定義一個變量,然后打印下這個變量存儲的地址

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

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

 

 

 

 

2.再定義一個變量

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

 

 

 

 

 

 

3.定義的兩個變量在內存里面是下面這樣子

0x200000000地址里面存儲的是 1

0x200000004地址里面存儲的是 5

 

 

 

定義一個指針變量,然后給指針變量賦值

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

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

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

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

然后記住一句話:

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

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

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

所以給指針賦值自然是把變量的地址給它.

 

 

 

 

 

 

一般哈,什么類型的指針變量就應該賦值什么類型變量的地址

列如再定義個 char 型

 

 

 

 

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

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

前面咱把一個變量的地址賦值給了指針了,然后搞C語言的那幫家伙們又規定

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

啥意思呢?

對照下面的程序 add = &value  , add記錄的就是變量value的地址,  然后 *add 就代表 value

 

 

 

 

 

 

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

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

 

2.既然*add 就代表 value,那么 *add = XXXX,不就是相當於 value=XXXX ,

 

 

 

 

 

 

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

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

 

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

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

 

 

 

 

 

 

 

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

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

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

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

 

 

 

 

 

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

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

 

 

 

 

 

2.這樣的見過沒

 

 

 

 

 

 

 

3.先記住一句話:

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

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

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

 

既然是地址,那么這個地址應該可以賦值給一個指針.

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

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

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

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

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

 

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

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

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

所以調用 fun(); 就等同於調用 function()

 

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

 

 

 

 

 

 

5.如果函數有返回值怎么辦

 

 

 

 

 

 

小總結一下

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

或是做地址之間的傳遞的.  &代表取地址符   *代表取數據

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

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

 

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

把數組的地址賦值給指針,然后用指針操作數組

 

 

 

 

 

 

 

函數的形參是一個指針

 

 

 

 

說下void*

void代表任意數據類型,所以void* XXX 就代表定義了一個任意類型的指針

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

列如下面的例子

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

所以 function(&value); 里面直接 &value

 

 

 

 

 

int valu = *(int *)data;

后面的 (int *)data 是先把這個數據類型強制轉換為 int的指針類型

然后組合前面的 * 就是取出來數據

然后賦值給 valu

 

 

 

 

結語

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

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

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

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

是以后必不可少的.

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

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

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

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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM