printf不明确_资源贴|不是吧,还有人不知道指针?你想知道还不点进来看看?...
??? C語(yǔ)言中最難學(xué)也是最難理解的莫過(guò)于指針,相當(dāng)多的同學(xué)在學(xué)到“指針”這一章節(jié)的時(shí)候,被這一個(gè)拗口又難以理解的詞澆了一盆冷水,學(xué)習(xí)C語(yǔ)言的熱情一下子降了一大半。那么今天我們就來(lái)探討一下"指針”吧!
一:通過(guò)一個(gè)變量的聲明來(lái)探究指針
int val = 10;
初學(xué)C語(yǔ)言常用的一個(gè)變量的定義,整形數(shù)據(jù)類(lèi)型,并且將10賦值給val。
那么在定義一個(gè)變量的過(guò)程中,計(jì)算機(jī)內(nèi)部發(fā)生了啥呢?
首先我類(lèi)比一個(gè)生活中的例子:
栗一為了方便統(tǒng)計(jì),水果商人給水果定了一個(gè)不同的編號(hào),例如蘋(píng)果111,梨子222在后續(xù)統(tǒng)計(jì)價(jià)目的時(shí)候,111就可以對(duì)應(yīng)蘋(píng)果,222就可以對(duì)應(yīng)梨子
在這里111的價(jià)格是10,對(duì)應(yīng)著蘋(píng)果的價(jià)格是10,梨子和香蕉同理,也就是說(shuō)蘋(píng)果有另一個(gè)“稱(chēng)呼”:111
那么這對(duì)我們理解定義一個(gè)變量有什么聯(lián)系呢?
在編譯器內(nèi),定義了一個(gè)變量后,它會(huì)向內(nèi)存中申請(qǐng)一段可用的地址空間用來(lái)存放數(shù)據(jù),這塊地址為了更好的方便用戶(hù)使用,咱們可以用一個(gè)名字來(lái)替代這地址,也就是所謂的變量名,也即是上圖中的水果名字和水果編號(hào)之間的關(guān)系。在后續(xù)的使用中,這變量的名字就直接代替了地址空間,給變量賦值,也即把數(shù)據(jù)放入地址空間中去。換句話說(shuō),二者本無(wú)區(qū)別,只是為了更好的記錄某些東西(數(shù)據(jù))。這會(huì)兒在來(lái)看看int val = 10;,是不是有不同的感覺(jué)了?
二:與指針的聯(lián)系
在前面討論了一個(gè)變量的定義的背后,發(fā)生了啥,接下來(lái)引入指針,在引入指針還是先看一下這個(gè):
int val = 10;
我們把val看成是一個(gè)蘋(píng)果,我們不希望記錄單詞,只想用數(shù)字來(lái)代替這個(gè)蘋(píng)果,比如我們用數(shù)字:?8386848來(lái)代替它,那么我們?cè)诮o這塊地址重新賦值的時(shí)候,是不是也可以放入val,也可以說(shuō)是放入8386848。
理解了上述,那么我們引入一個(gè)針對(duì)上面val變量的指針:
1.int val = 10;
2.int *pVal; //定義一個(gè)指向int類(lèi)型的指針pVal
3.pVal = &val;? //將指針pval指向變量val
指針的定義通常是:
數(shù)據(jù)類(lèi)型 *變量名; //注意這里的 星號(hào)
必須要明確一點(diǎn),指針不是什么玄乎的東西,它與val一樣也是一個(gè)變量,只是這個(gè)“變量”的用途比較特殊,他專(zhuān)門(mén)用來(lái)存放地址的,注意是專(zhuān)門(mén),不能用來(lái)存放別的數(shù)據(jù)。可能有小伙伴對(duì)地址這個(gè)概念還比較模糊,這里我用比喻的方法講一下地址:
栗二想象一下,你是一個(gè)送牛奶的,你必須得把你手上的牛奶送到不同的住宅里面去,你不可能根據(jù)名字去找,因?yàn)橛锌赡苡邢嗤值念櫩?#xff0c;導(dǎo)致出錯(cuò)。每一個(gè)住宅都有一個(gè)唯一的編號(hào),比如說(shuō)住宅A的編號(hào)是A0大道11街32戶(hù),住宅B是B1大道22街39戶(hù),根據(jù)這個(gè)你便能準(zhǔn)確無(wú)誤的把牛奶送到顧客手上。這里的牛奶看作是數(shù)據(jù),編號(hào)看作是地址,顧客名字看作是變量。
上述例子可能不是很恰當(dāng),但是對(duì)理解地址來(lái)說(shuō)應(yīng)該是有幫助的。
指針變量的作用呢,就是用來(lái)存放這些地址的。
在計(jì)算機(jī)內(nèi)存中,地址空間實(shí)際上也是一串串?dāng)?shù)字構(gòu)成的,運(yùn)行以下代碼:
1.? ?#include
2.
3.? ?int main()
4.? ?{
5.int val = 10;
6.int* pVal; //定義一個(gè)指向int類(lèi)型的指針pVal
7.pVal = &val;
8.printf("指針變量的值%d, 變量val的地址:%d\n", pVal, &val);
9.printf("指針變量取值結(jié)果:%d, 變量val的值: %d\n", *pVal, ?? val);
10.}
輸出結(jié)果:
1.指針變量的值13630100, 變量val的地址:13630100
2.指針變量取值結(jié)果:10, 變量val的值: 10
可以發(fā)現(xiàn)指針變量的值實(shí)際上就是變量val的地址,指針取值操作后的值就是變量val的值。細(xì)心的同學(xué)也能發(fā)現(xiàn)指針變量自己也有一個(gè)地址,沒(méi)錯(cuò),因?yàn)樗彩且粋€(gè)變量,它自身也是需要申請(qǐng)地址空間的。這也是為啥后面會(huì)有指向指針的指針(二級(jí)指針),以及更復(fù)雜的三級(jí)指針。
三:與指針有關(guān)的兩個(gè)操作符號(hào)
學(xué)過(guò)一點(diǎn)指針知識(shí)的同學(xué)都知道與指針相關(guān)的符號(hào)有?*?和?&
*?:星號(hào),有兩個(gè)不同的用法:1、定義指針的時(shí)候,它表明該變量是一個(gè)指針,而不是其他類(lèi)型的變量,例如:int val;?和?int *pval;是兩個(gè)完全不同的意思,前者是定義一個(gè)int類(lèi)型的變量,后者是定義了一個(gè)指向int類(lèi)型的指針變量。2、取值操作的時(shí)候,它表示的是取出該地址存放的值,上述代碼中的val的值,也就是10。
&:ampersand,意義也很簡(jiǎn)單,返回一個(gè)變量的地址。例如&val,就是返回變量val在內(nèi)存中的地址空間,假如該變量地址是 13630100,那么返回的數(shù)據(jù)就是13630100。返回的數(shù)據(jù)可以用一個(gè)指針變量來(lái)存放,也必須是指針變量來(lái)存放。
1.int val;
2.int *p;
3.&val // 返回變量val所在的地址。
4.&p ?// 返回指針變量p所在的地址,也是由指針存放,不過(guò)是由二級(jí)指針存放。
四:總結(jié)
指針,其實(shí)也是地址的另一個(gè)代名詞而已,指針即是地址,地址也可以說(shuō)是指針,只是叫法不一樣。指針變量與其他類(lèi)型的變量一樣,也是用來(lái)存放數(shù)據(jù)的,只是這個(gè)數(shù)據(jù)稍稍有些特殊:地址。與指針有關(guān)的兩個(gè)操作分別是*和&,*在定義和取值操作的時(shí)候代表的不同的含義,一個(gè)是定義指針變量,一個(gè)是取出指針變量存放的地址中的值。&的作用是返回該變量的地址。在后續(xù)的學(xué)習(xí)中,會(huì)發(fā)現(xiàn)數(shù)組名字其實(shí)就是一個(gè)指針變量,指針變量也能進(jìn)行 加 和 減的操作,由于是地址是數(shù)字,加減操作后的結(jié)果也是數(shù)字。在更后續(xù)的學(xué)習(xí)中會(huì)學(xué)習(xí)到二級(jí),三級(jí)指針,還有函數(shù)指針等等。
(如有錯(cuò)誤,歡迎指正)
往期看點(diǎn)
▼
“碼”上學(xué)習(xí)|程序的“靈魂”之排序算法
Shining|“碼”上學(xué)習(xí)---初探前端
Take you fly|游戲開(kāi)發(fā)
本期編輯:賴(lài)聲宇
圖文來(lái)源:1804 朱英鵬
責(zé)任編輯:黃福娣
審核人:翁麗明
因?yàn)槟愕姆窒怼Ⅻc(diǎn)贊、在看我有足足的精氣神兒! 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的printf不明确_资源贴|不是吧,还有人不知道指针?你想知道还不点进来看看?...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 可基于文本生成图像了,微软宣布必应聊天整
- 下一篇: 如何获取当日日期_Power BI时间智