我最近跟很多在學(xué)C語(yǔ)言的年輕人聊天囊蓝,發(fā)現(xiàn)一個(gè)普通的痛點(diǎn)——C語(yǔ)言指針很難學(xué)邪媳!這時(shí)候我就會(huì)說(shuō):指針,傳說(shuō)中是C語(yǔ)言中的一個(gè)難點(diǎn)檬洞,且是難點(diǎn)中的難點(diǎn)狸膏。我會(huì)搜時(shí)間整理一個(gè)C語(yǔ)言指針的文章...
接著,今天終于實(shí)現(xiàn)了添怔!
本文在教材的基礎(chǔ)上湾戳,再詳細(xì)地談?wù)劇爸羔槨边@個(gè)東東,力爭(zhēng)讓大家能理解它广料。
一砾脑、指針的概念
關(guān)于指針的定義,很多教材一般給出“它是一個(gè)地址”艾杏,“存儲(chǔ)的是變量的地址”韧衣,“指向了一個(gè)值”等等描述。這樣描述其實(shí)也沒(méi)錯(cuò),但是就是不那么好理解畅铭。我覺(jué)得要理解指針萧求,無(wú)需給出什么定義,只需講透如下5個(gè)點(diǎn)顶瞒,我認(rèn)為基本就可以理解一個(gè)指針了夸政。
這5個(gè)點(diǎn)我總結(jié)如下:
1. 指針是一個(gè)普通的變量;
2. 既然指針是變量榴徐,那么肯定有自己的類(lèi)型守问;
3. 既然指針是變量,那么肯定有自己的值坑资;
4. 只不過(guò)指針的值跟一般變量的值不太一樣耗帕,指針的值是一個(gè)“地址”。
5. 指針指向的數(shù)據(jù)
關(guān)于怎么快速學(xué)C/C++游戲編程袱贮,有什么方法仿便,這個(gè)問(wèn)題,想必大家都已經(jīng)心中有數(shù)了攒巍,打算深入了解這個(gè)行業(yè)的朋友嗽仪,可以加下小編的C/C++游戲編程學(xué)習(xí)裙:453+243+280,不管你是小白還是大牛柒莉,小編我都?xì)g迎闻坚,不定期分享干貨,包括小編自己整理的一份2018最新的C/C++資料和0基礎(chǔ)入門(mén)教程兢孝,歡迎初學(xué)和進(jìn)階中的小伙伴窿凤。
每天晚上20:00我都會(huì)開(kāi)直播給大家分享C/C++游戲編程學(xué)習(xí)知識(shí)和路線(xiàn)方法,群里會(huì)不定期更新最新的教程和學(xué)習(xí)方法(進(jìn)群送2018C/C++游戲編程學(xué)習(xí)教程)跨蟹,大家都是學(xué)習(xí)C/C++的雳殊,或是轉(zhuǎn)行,或是大學(xué)生窗轩,還有工作中想提升自己能力的前端黨夯秃,如果你是正在學(xué)習(xí)C/C++的小伙伴可以加入學(xué)習(xí)。最后祝所有程序員都能夠走上人生巔峰品姓,讓代碼將夢(mèng)想照進(jìn)現(xiàn)實(shí)寝并,非常適合新手學(xué)習(xí)箫措,有不懂的問(wèn)題可以隨時(shí)問(wèn)我腹备,工作不忙的時(shí)候希望可以給大家解惑。
為了講透這5個(gè)點(diǎn)斤蔓,下面列舉一段代碼植酥,如下。
二、代碼來(lái)說(shuō)明
請(qǐng)欣賞以下代碼
運(yùn)行結(jié)果是:
三友驮、下面結(jié)合代碼我來(lái)談?wù)勀?個(gè)點(diǎn):
指針是一個(gè)普通的變量
本例中漂羊,有一個(gè)字符變量“c”,它的值是string[0]卸留,也就是“S”走越,這個(gè)大家都很好理解。
還有一個(gè)指針“pointer”耻瑟,注意旨指,它也是一個(gè)變量,和字符“c”一樣喳整,就是一個(gè)普通的變量而已谆构,它也有一個(gè)值,它的值是“&string[0]”框都,從運(yùn)行結(jié)果來(lái)看搬素,就是“0022FED9”,這是一個(gè)16進(jìn)制的數(shù)魏保。
2. 指針自己的類(lèi)型
本例中熬尺,字符變量“c”的類(lèi)型是“char”,數(shù)組string的類(lèi)型也是“char”谓罗,那么指針“pointer”的類(lèi)型也是“char”猪杭。不過(guò)與c和string的類(lèi)型char相比,pointer類(lèi)型的char卻有一點(diǎn)小區(qū)別妥衣。
變量c的類(lèi)型char說(shuō)明了c的值“S”是一個(gè)字符數(shù)據(jù)皂吮,數(shù)組string的類(lèi)型char說(shuō)明了其每一個(gè)數(shù)組元素也是字符數(shù)據(jù),但是指針pointer的類(lèi)型char是不是也說(shuō)明“0022FED9”是一個(gè)字符數(shù)據(jù)呢税手?傻子都知道當(dāng)然不是啦蜂筹!那么pointer的char類(lèi)型到底是在說(shuō)誰(shuí)呢?這就是指針的一個(gè)詭異的地方芦倒。等講完第5點(diǎn)指針指向的數(shù)據(jù)你就知道了艺挪。
3. 指針自己的值
上面已經(jīng)說(shuō)了,指針既然也是一個(gè)變量兵扬,那么肯定有自己的值麻裳,在本例中,指針自己的值就是“0022FED9”器钟,是一個(gè)16進(jìn)制的數(shù)津坑,這個(gè)值哪來(lái)的?是“&string[0]”賦予給指針的傲霸。
“0022FED9”這個(gè)東東也是很多教材中提到的“地址”疆瑰。很多人會(huì)想眉反,你告訴我“0022FED9”是一個(gè)值我還好理解,你告訴我它還是一個(gè)什么地址穆役,這就讓人暈菜了寸五,下面第4點(diǎn)就來(lái)說(shuō)說(shuō)這個(gè)“0022FED9”。
4. 指針的值
不知大家發(fā)現(xiàn)沒(méi)有耿币,在C程序中梳杏,如果定義了int,char等變量淹接,那么在代碼中很多地方都會(huì)用到這些變量的值秘狞。比如在本例中,定義了數(shù)組string蹈集,則接下來(lái)的代碼就用到了數(shù)組的元素烁试,也就是printf函數(shù)輸出來(lái)。如果定義了一個(gè)指針變量拢肆,可能大家很少看到在代碼中會(huì)用到指針的值减响,比如在本例中,大家就沒(méi)有看到用到“0022FED9”郭怪。
確實(shí)支示,相比一般類(lèi)型變量的值被頻繁使用而言,指針的值很少會(huì)被直接用到鄙才。注意颂鸿,這里說(shuō)的很少被直接用到,是指寫(xiě)代碼的人攒庵,也就是程序猿會(huì)很少用到嘴纺,但有一個(gè)角色用指針的值用的非常多,就是操作系統(tǒng)浓冒。
比如在本例中栽渴,輸出數(shù)組的每一個(gè)元素時(shí),我表面上是用的*(pointer + index)來(lái)輸出的稳懒,其實(shí)在背后闲擦,操作系統(tǒng)在執(zhí)行這個(gè)語(yǔ)句時(shí),都是利用指針的值“0022FED9”來(lái)找到數(shù)組的每一個(gè)元素的场梆,所以程序最終能正確輸出數(shù)組的每一個(gè)字符墅冷。
上面也說(shuō)了,“0022FED9”是被系統(tǒng)用的最多或油,為啥被系統(tǒng)用的最多呢寞忿?因?yàn)椤?022FED9”是一個(gè)地址,是string數(shù)組的第一個(gè)元素“S”的地址装哆。說(shuō)的再通俗一點(diǎn)罐脊,字符“S”放在一個(gè)大小為1BYTE的內(nèi)存塊里定嗓,這個(gè)內(nèi)存塊的地址就是“0022FED9”蜕琴。
5. 指針指向的數(shù)據(jù)
在第4點(diǎn)說(shuō)到萍桌,字符“S”放在一個(gè)大小為1BYTE的內(nèi)存塊里,這個(gè)內(nèi)存塊的地址就是“0022FED9”凌简,那么上炎,我們就說(shuō),指針“pointer”的值是“0022FED9”雏搂,在地址為“0022FED9”的地方放了一個(gè)字符“S”藕施,這個(gè)“S”就是指針“pointer”指向的數(shù)據(jù),且通過(guò)“*pointer”這種寫(xiě)法來(lái)獲取“S”凸郑,從某種意義上來(lái)說(shuō):
pointer 等于 0022FED9裳食;
*pointer等于“S”,加上*號(hào)芙沥,就是直搗黃龍诲祸,拿到“S”。
此時(shí)我們可以說(shuō)說(shuō)第2點(diǎn)中提到的指針的類(lèi)型是來(lái)修飾誰(shuí)的問(wèn)題了而昨。在本例中救氯,pointer的類(lèi)型char顯然不是來(lái)修飾“0022FED9”的,它是來(lái)告訴操作系統(tǒng)歌憨,我pointer認(rèn)為“0022FED9”這個(gè)地方存放的是字符着憨,是字符,是字符务嫡,且占1個(gè)BYTE的大小甲抖。
如果pointer的類(lèi)型改為int,我pointer就認(rèn)為“0022FED9”這個(gè)地方存放的是整數(shù)心铃,是整數(shù)惧眠,是整數(shù)字符,且占4個(gè)BYTE的大小于个。