国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

指針的深入理解(1)

2019-11-10 17:24:09
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
       關(guān)于指針的知識(shí),我整理了筆記。同時(shí)參考了《你不再害怕指針》這篇優(yōu)秀的文章。從最簡(jiǎn)單最基本的指針開(kāi)始,慢慢深入到復(fù)雜。在講解指針之前,我是先了解了c/c++中的內(nèi)存管理知識(shí)。這樣有助于加強(qiáng)對(duì)指針的知識(shí)的深入的理解。關(guān)于內(nèi)存管理,訪問(wèn)博客:http://blog.csdn.net/chen1083376511/article/details/54930191----------------------------------------------------------------------------------------------------------------------------------------------概念:指針:一塊內(nèi)存的地址.指針變量:用來(lái)保存某變量的地址的變量?jī)烧哧P(guān)系:指針變量里面存的是某變量的地址一般變量和指針變量的區(qū)別:一般變量:存放的是數(shù)據(jù)本身,訪問(wèn)方式稱為直接訪問(wèn)方式。指針變量:存放的是數(shù)據(jù)的地址,訪問(wèn)方式稱為間接訪問(wèn)方式。-----------------------------------------------------------------------------------------------------------------------------------------------關(guān)于網(wǎng)友們對(duì)指針本身是否存在一個(gè)地址的問(wèn)題,頗有爭(zhēng)議。為了解決這個(gè)問(wèn)題,我在vc6.0環(huán)境下編譯運(yùn)行以下段代碼:
#include<stdio.h>int main(){	int a;	int *p;	PRintf("指針p本身的地址:%d/n",&p);	printf("變量a的地址:%d/n",&a);	a=1;	p=&a;	printf("指針變量p指向變量a的地址:%d/n",p);	printf("指針變量p指向變量a的地址,其地址的值:%d/n",*p);	return 0;}為了便于理解,我假設(shè)指針p本身的地址為pppp,變量a的地址為aaaa。用pppp,aaaa表示各自地址,雖然地址書(shū)寫(xiě)不合法,但是便于理解,只能這么干了)輸出結(jié)果:指針p本身的地址:pppp變量a的地址:aaaa指針變量p指向變量a的地址:aaaa指針變量p指向變量a的地址,其地址的值:1分析結(jié)果:int a;//系統(tǒng)為變量a分配的首地址為aaaa指針變量p定義時(shí),本身占有內(nèi)存,系統(tǒng)為其分配內(nèi)存地址pppp.當(dāng)p=&a(變量a的地址賦值給指針變量p,也就是說(shuō)指針變量p指向了變量a的地址)時(shí),指針變量里面存放的就是aaaa地址.但是指針p本身的地址仍然是pppp.

--------------------------------------------------------------------------------------------------------------------------------------------

變量a的值,變量a的地址,指針變量p,指針的關(guān)系:

指針變量相當(dāng)于學(xué)校這個(gè)整體,指針相當(dāng)于學(xué)校的地址。

變量a相當(dāng)于小王這個(gè)人,變量a的值是小王的書(shū)本。

變量a的地址是小王的家庭地址。

這樣可以說(shuō):

學(xué)校記錄了小王的家庭地址。

如果有人想找小王借書(shū),可以通過(guò)訪問(wèn)學(xué)校的地址,來(lái)尋找學(xué)校已經(jīng)存進(jìn)去的小王的家庭地址,然后可以

間接訪問(wèn)小王的家庭地址,可以借到小王家地址里面的書(shū)本。

-----------------------------------------------------------------------------------------------------------------------------------------------p,*p,&p的概念:p:p是一個(gè)指針變量的名字,表示此指針變量指向的內(nèi)存地址,如果使用cout<<p來(lái)輸出的話,它將是一個(gè)16進(jìn)制數(shù)。*p:表示此指針指向的內(nèi)存地址中存放的內(nèi)容,一般是一個(gè)和指針類型一致的變量或者常量。&p:&p取指針p的地址,&是取地址運(yùn)算符.定義指針變量p,系統(tǒng)就為其開(kāi)辟內(nèi)存,分配指針本身的地址。如果定義一般變量a,那么&a就是系統(tǒng)為其開(kāi)辟一個(gè)內(nèi)存,分配變量a的地址。------------------------------------------------------------------------------------------------------------------------------------------------指針和常量的問(wèn)題:
#include<stdio.h>int main(){int a;int *p=(int *)5;//指針變量存儲(chǔ)的是常量5a=1;printf("指針變量p指向某個(gè)地址:%d/n",p);return 0;}輸出結(jié)果:

指針變量p指向某個(gè)地址:5

分析結(jié)果:

輸出結(jié)果中的指針變量p指向了常量5,因?yàn)橹羔樧兞堪?這個(gè)當(dāng)做了某個(gè)地址來(lái)存進(jìn)去。

至于為什么要用(int *)5,下面會(huì)講到。

-------------------------------------------------------------------------------------------------------------------------------------------------

對(duì)于常量是否占有內(nèi)存,網(wǎng)友們對(duì)此也有些不同的觀點(diǎn)。我認(rèn)為有些常量(但有些常量不占有內(nèi)存)是占有內(nèi)存的。占有內(nèi)存的常量:字符串常量(字符串常量會(huì)放在一個(gè)專用的字符串池內(nèi)存塊中,或者放在靜態(tài)數(shù)據(jù)區(qū)中。),const常量(不是真正意義上的常量,要占用內(nèi)存空間)。

不占有內(nèi)存的常量:字符型常量,整型常量(浮點(diǎn)型常量占有內(nèi)存)。

------------------------------------------------------------------------------------------------------------------------------------------------

不占有內(nèi)存的常量,它存在于常量存儲(chǔ)區(qū)這個(gè)特殊的存儲(chǔ)區(qū)里面。

常量存儲(chǔ)區(qū)是一塊比較特殊的存儲(chǔ)區(qū),他們里面存放的是常量,不允許修改(當(dāng)然,你要通過(guò)非正當(dāng)手段也可以修改)。

還有一種關(guān)于一些常量不占有內(nèi)存的說(shuō)法:這類不占有內(nèi)存的常量類似于匯編語(yǔ)言的立即數(shù)。讀到一條指令,帶有立即數(shù),把立即數(shù)放到寄存器。對(duì)于字符型常量(例如'a')和整型常量(例如1,2,3),他們屬于立即數(shù),寫(xiě)在代碼里面的。他們存放在寄存器上的沒(méi)有所謂的內(nèi)存和地址。因?yàn)榧拇嫫骱蛢?nèi)存地址是兩碼事,沒(méi)必要在內(nèi)存上存放這類不占有內(nèi)存的數(shù)值。字符串常量和字符型常量取地址的區(qū)別:C/C++只可以用指針取字符串常量的地址,該類被認(rèn)為是左值,而其他的字面值常量(literal constant),則被認(rèn)為是右值,不允許取地址。至于const常量,只能說(shuō)是一個(gè)const修飾的只讀變量,和字面值常量不同。------------------------------------------------------------------------------------------------------------------------------------------------如果把int *p=(int *)5;改成int *p=5或者int *p=&5就會(huì)報(bào)錯(cuò).在這里int *p=&5,有些網(wǎng)友就誤以為常量是沒(méi)有地址的,也就是沒(méi)有內(nèi)存的。我認(rèn)為這種說(shuō)法是錯(cuò)誤的。上面我已經(jīng)講過(guò),有些常量存在于特殊的常量存儲(chǔ)區(qū),或者存在于寄存器中,。常量是不能取到地址的,就算取得到也是沒(méi)有意義的。

int *p=5報(bào)錯(cuò),因?yàn)橹羔樧兞亢统A績(jī)烧叩臄?shù)據(jù)類型不一樣。一個(gè)是int*,一個(gè)是const int.

所以int *p=(int *)5;是把普通的常量強(qiáng)制轉(zhuǎn)換成返回整型數(shù)據(jù)的指針。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 临海市| 大化| 磐石市| 邵阳市| 安丘市| 会宁县| 河北区| 凤阳县| 安徽省| 桓台县| 石棉县| 扎囊县| 革吉县| 延安市| 宽甸| 甘孜| 弥勒县| 陆川县| 克东县| 滨海县| 松桃| 阳山县| 根河市| 武川县| 石棉县| 屏东县| 绩溪县| 巫溪县| 宿迁市| 吉水县| 邵武市| 建宁县| 车险| 柞水县| 偃师市| 黑河市| 会同县| 长春市| 平昌县| 新营市| 永修县|