可以理解為指向地址愿汰!本質(zhì)就是地址,需要賦值的也是地址乐纸。
ps:我們定義了指針之后盡量要及時進(jìn)行賦值衬廷,以免出現(xiàn)野指針,導(dǎo)致程序出錯汽绢。如果暫時不知道賦值什么泵督,就可以先賦值為空(null)。
例:
fun函數(shù)收到了a庶喜,b的地址小腊,括號里面的代表解引用,里面的x就是a久窟,*y就是b秩冈。所以a,b被重新賦值了斥扛。
指針的偏移(按內(nèi)存偏)
在數(shù)組中入问,里面的變量都是相同類型,地址連續(xù)的稀颁。如果我們要選中其中一個數(shù)據(jù)該怎么做芬失。
例:
因?yàn)閿?shù)組是int類型的,所以一個變量占四個字節(jié)匾灶,地址是連續(xù)的棱烂。定義了指針p,然后偏移阶女,+是向右颊糜,-是向左,最后輸出解引用p秃踩,也就是數(shù)組中第二個變量的值衬鱼。
其中因?yàn)橹羔樀念愋褪莍nt型,向右偏移也就是移動了3個變量的地方憔杨,12個字節(jié)鸟赫,對應(yīng)數(shù)組(int類型)移動十二個字節(jié)也就是移動了3位。
咋解釋呢O稹抛蚤!指針p是double類型,一開始指向的是數(shù)組的首位(1)妖啥,p++霉颠,也就是p向右移動了一位,按照字節(jié)就是八個字節(jié)(因?yàn)槭莇ouble類型的)荆虱,所以就是向右移動了八個字節(jié)蒿偎,輸出的時候把p轉(zhuǎn)成了int類型,移動八個字節(jié)后相當(dāng)于int類型移動了兩個變量怀读,所以對應(yīng)的就是3诉位。 同理可得:
char類型的數(shù)據(jù)需要偏移四次才能到第二個數(shù)據(jù)。
指針也是有類型的菜枷,定義就是類型*
特殊指針
1.指針函數(shù)
定義:是一個函數(shù)苍糠,但是這個函數(shù)的返回值類型是個指針。
上圖的fun函數(shù)就是指針函數(shù)啤誊,返回的值是指針岳瞭。
2.函數(shù)指針
定義:是一個指針拥娄,這個指針的指向是一個函數(shù)。
函數(shù)指針的形參列表就是要指向的函數(shù)的形參列表瞳筏。
將函數(shù)指針當(dāng)做形參稚瘾,就可以在函數(shù)里調(diào)用別的函數(shù)。
如果給函數(shù)指針取別名:
其中pF的函數(shù)指針當(dāng)做類型使用了姚炕,定義了pf摊欠,其功能和直接在形參里面寫函數(shù)指針的作用是一樣的。
3.常量指針&指針常量
常量指針:是一個指針柱宦,指向一個常量些椒。
指針常量:是一個常量,存儲的是指針掸刊。
為什么上圖會報錯免糕,因?yàn)楦淖兞酥羔槼A康闹赶颉?br>
但是指針常量可以修改內(nèi)容:大端存儲和小端存儲
大端存儲:高位存高位
小端存儲:高位存低位
數(shù)組指針和指針數(shù)組
指針數(shù)組:是一個數(shù)組,存儲的是指針痒给。
數(shù)組指針:是一個指針说墨,指向的是一個數(shù)組(至少是二維數(shù)組↑)
有括號的是數(shù)組指針,沒括號的是指針數(shù)組(咋理解呢苍柏!指針需要括號和定義尼斧,數(shù)組不需要括號和定義)
數(shù)組指針的應(yīng)用:
函數(shù)fun的功能是輸出2列數(shù)組的各個元素,方便之處在于可以輸出任何想輸出的列數(shù)為2的數(shù)組试吁。
多級指針:
例:(我覺得有點(diǎn)小難棺棵,但是勉強(qiáng)能懂)
下面這個是視頻里面的:(目前能看明白!)
內(nèi)存四區(qū)
結(jié)構(gòu)體指針(重要Oê础)
需要注意的是:結(jié)構(gòu)體指針的類型和結(jié)構(gòu)體是一樣的V蛐簟!
例:(結(jié)構(gòu)化數(shù)組余耽、指針數(shù)組)
例:(指針的偏移)
動態(tài)內(nèi)存分配
(為什么要從堆區(qū)申請內(nèi)存缚柏?因?yàn)槎褏^(qū)的內(nèi)存大,棧區(qū)的內(nèi)存有時候不夠大碟贾。)
:從堆區(qū)申請內(nèi)存币喧,自己使用(記得釋放),從堆區(qū)申請的內(nèi)存是通過指針進(jìn)行管理的袱耽!
1.申請是通過函數(shù)malloc杀餐、calloc、realloc
2.釋放是用free函數(shù)進(jìn)行
3.在釋放內(nèi)存的時候朱巨,free函數(shù)中填的指針史翘,必須要指向內(nèi)存的首地址
1.malloc
還有就是malloc要引用頭文件!(#include <stdlib.h>)
例:
但是!一般都不這么定義琼讽!
例:
一般都是這么定義的1胤濉!
還有一種賦值方法:(逐字節(jié)賦值)
2.realloc(重分配)
本來p是25個字節(jié)钻蹬,但是重新分配之后自点,就有50個字節(jié),不過只賦值了25個字節(jié)脉让,所以后面會出現(xiàn)亂碼。
如果內(nèi)存變小的話(比如10)功炮,如果輸出25個的話溅潜,前十個正常,后面是亂碼薪伏。
3.calloc
還是需要手動釋放滚澜。