假設一下
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%的程式員敲的是字母,寫的是代碼!
當你開始封裝的時候,你寫的便是思想!
但是需要一定的基礎知識儲備才能達到!