C指針總結(jié)
指針
指針的概念
指針是存放地址的變量
取i01地址并放入p01中

打印地址需要使用%p,如下圖

指針類型
每一種數(shù)據(jù)類型都對(duì)應(yīng)一種指針
?
指針類型有什么用?
分別查詢int,char類型地址


Int類型占4個(gè)字節(jié)

Char類型占1個(gè)字節(jié)
?為了修改時(shí)明確修改的字節(jié)數(shù),所以使用不同指針類型指定存放的數(shù)據(jù)類型
Int類型指針變量+1時(shí)增加4個(gè)字節(jié)
Char類型指針變量+1時(shí)增加1個(gè)字節(jié)

野指針(大部分指針問題都來自于此,且有部分難以解決)
野指針就是指針指向的位置是不可知的(隨機(jī)的、不正確的、沒有明確限制的)
野指針成因
指針未初始化

指針越界訪問

指針指向的內(nèi)存被釋放(會(huì)在動(dòng)態(tài)內(nèi)存開辟中詳細(xì)講解)

如上圖,局部變量i01在main01方法結(jié)束后已經(jīng)被釋放,但main01傳回了i01的地址,所以pi01接收的是一塊已經(jīng)被釋放的地址
如何避免野指針
1.???? 指針創(chuàng)建時(shí)初始化(沒有確定的值的時(shí)候可以賦值NULL空指針)
2.???? 避免數(shù)組越界訪問(重要?。∠到y(tǒng)一般不會(huì)報(bào)錯(cuò)?。。?/p>
3.???? 指針?biāo)竷?nèi)存釋放時(shí)(局部變量等)將指針賦值NULL
4.???? 指針不用時(shí)將指針賦值NULL
5.???? 不訪問空指針
指針運(yùn)算
指針 加減 整數(shù)
數(shù)組首地址加整數(shù)相當(dāng)于修改訪問數(shù)組的下標(biāo)

指針? 減 指針
指針之間的加法運(yùn)算沒有意義,減法運(yùn)算有實(shí)用價(jià)值
數(shù)組地址相減時(shí),不會(huì)得到相隔的字節(jié)數(shù)(相隔元素個(gè)數(shù)*數(shù)據(jù)字節(jié)數(shù)),而是直接得到相隔元素個(gè)數(shù)

應(yīng)用:計(jì)算字符串長度

指針關(guān)系運(yùn)算
說白了就是比較地址大?。? >? ,? <? ,? =? )
二級(jí)指針

上面定義的i01指向整形0,
指針p01指向i01的地址,
二級(jí)指針pp01指向p01的地址,
三級(jí)指針ppp01指向pp01的地址,
而最后一行打印的則是0
在這里之所以只討論二級(jí)指針而不說多級(jí)指針,是因?yàn)橹挥卸?jí)指針有使用價(jià)值,再往上的三四級(jí)指針并沒有什么應(yīng)用價(jià)值
指針數(shù)組
定義:

空類型指針
也叫做void 指針,任何類型的指針都可以直接賦值給 void 指針,而無需進(jìn)行其他相關(guān)的強(qiáng)制類型轉(zhuǎn)換。

雖然如此,但這并不意味著可以無需任何強(qiáng)制類型轉(zhuǎn)換就將 void 指針直接賦給其他類型的指針,因?yàn)椤翱疹愋汀笨梢园荨坝蓄愋汀?,而“有類型”則不能包容“空類型”。正如我們可以說“男人和女人都是人”,但不能說“人是男人”或者“人是女人”一樣。

使用場(chǎng)景
?
指針作參數(shù)時(shí)
我們想要使用函數(shù)修改主函數(shù)中的變量時(shí)

傳參,然后自增,看看這個(gè)函數(shù)是否可行

調(diào)用后發(fā)現(xiàn)i01仍然是0,但我們?cè)趍ain01中明明已經(jīng)自增過了,憑什么主函數(shù)不自增?
簡(jiǎn)單來說,調(diào)用函數(shù)時(shí),形參i02會(huì)自立門戶,自己開辟一塊內(nèi)存接收實(shí)參i01的變量值0,此時(shí)修改i02只是修改這個(gè)局部變量的值,i01并不會(huì)受影響
?
我們將i02設(shè)為返回值,可以解決這個(gè)問題

i01成功自加,但是這種方法,在需要返回多個(gè)值或返回?cái)?shù)組時(shí),非常不方便
這時(shí)就輪到指針出場(chǎng)了,我們將main01的參數(shù)換成指針

i01成功自加
使用指針既可以完美實(shí)現(xiàn)我們想要的效果,也不需要額外返回值
數(shù)組指針作參數(shù)時(shí)
我們想要使用函數(shù)修改主函數(shù)中的數(shù)組時(shí)

數(shù)組長度使用sizeof(i01)/sizeof(i01[0])計(jì)算
由于數(shù)組名本身就是指針,所以這里不需要額外操作
?
數(shù)組本身就是指針,所以數(shù)組指針就相當(dāng)于二重指針,我們來看看數(shù)組
常用函數(shù)
?
開辟一塊空間malloc關(guān)鍵字
該函數(shù)返回一個(gè)指針 ,指向已分配大小的內(nèi)存。如果請(qǐng)求失敗,則返回 NULL。
(void *)malloc(size_t size)
參數(shù)
void* --返回的指針類型
size?-- 內(nèi)存塊的大小,以字節(jié)為單位。
實(shí)例
返回一個(gè)整形指針,開辟n個(gè)整形的內(nèi)存
int *pi01=( int * )malloc( sizeof(int)*n )
?
?
C 庫函數(shù) – malloc() | 菜鳥教程 (runoob.com)