#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ù)的指針。
|
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注