#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;}為了便于理解,我假設指針p本身的地址為pppp,變量a的地址為aaaa。用pppp,aaaa表示各自地址,雖然地址書寫不合法,但是便于理解,只能這么干了)輸出結果:指針p本身的地址:pppp變量a的地址:aaaa指針變量p指向變量a的地址:aaaa指針變量p指向變量a的地址,其地址的值:1分析結果:int a;//系統為變量a分配的首地址為aaaa指針變量p定義時,本身占有內存,系統為其分配內存地址pppp.當p=&a(變量a的地址賦值給指針變量p,也就是說指針變量p指向了變量a的地址)時,指針變量里面存放的就是aaaa地址.但是指針p本身的地址仍然是pppp.--------------------------------------------------------------------------------------------------------------------------------------------
變量a的值,變量a的地址,指針變量p,指針的關系:
指針變量相當于學校這個整體,指針相當于學校的地址。
變量a相當于小王這個人,變量a的值是小王的書本。
變量a的地址是小王的家庭地址。
這樣可以說:
學校記錄了小王的家庭地址。
如果有人想找小王借書,可以通過訪問學校的地址,來尋找學校已經存進去的小王的家庭地址,然后可以
間接訪問小王的家庭地址,可以借到小王家地址里面的書本。
-----------------------------------------------------------------------------------------------------------------------------------------------p,*p,&p的概念:p:p是一個指針變量的名字,表示此指針變量指向的內存地址,如果使用cout<<p來輸出的話,它將是一個16進制數。*p:表示此指針指向的內存地址中存放的內容,一般是一個和指針類型一致的變量或者常量。&p:&p取指針p的地址,&是取地址運算符.定義指針變量p,系統就為其開辟內存,分配指針本身的地址。如果定義一般變量a,那么&a就是系統為其開辟一個內存,分配變量a的地址。------------------------------------------------------------------------------------------------------------------------------------------------指針和常量的問題:#include<stdio.h>int main(){int a;int *p=(int *)5;//指針變量存儲的是常量5a=1;printf("指針變量p指向某個地址:%d/n",p);return 0;}輸出結果:指針變量p指向某個地址:5
分析結果:輸出結果中的指針變量p指向了常量5,因為指針變量把5這個當做了某個地址來存進去。
至于為什么要用(int *)5,下面會講到。
-------------------------------------------------------------------------------------------------------------------------------------------------
對于常量是否占有內存,網友們對此也有些不同的觀點。我認為有些常量(但有些常量不占有內存)是占有內存的。占有內存的常量:字符串常量(字符串常量會放在一個專用的字符串池內存塊中,或者放在靜態數據區中。),const常量(不是真正意義上的常量,要占用內存空間)。不占有內存的常量:字符型常量,整型常量(浮點型常量占有內存)。
------------------------------------------------------------------------------------------------------------------------------------------------
不占有內存的常量,它存在于常量存儲區這個特殊的存儲區里面。常量存儲區是一塊比較特殊的存儲區,他們里面存放的是常量,不允許修改(當然,你要通過非正當手段也可以修改)。
還有一種關于一些常量不占有內存的說法:這類不占有內存的常量類似于匯編語言的立即數。讀到一條指令,帶有立即數,把立即數放到寄存器。對于字符型常量(例如'a')和整型常量(例如1,2,3),他們屬于立即數,寫在代碼里面的。他們存放在寄存器上的沒有所謂的內存和地址。因為寄存器和內存地址是兩碼事,沒必要在內存上存放這類不占有內存的數值。字符串常量和字符型常量取地址的區別:C/C++只可以用指針取字符串常量的地址,該類被認為是左值,而其他的字面值常量(literal constant),則被認為是右值,不允許取地址。至于const常量,只能說是一個const修飾的只讀變量,和字面值常量不同。------------------------------------------------------------------------------------------------------------------------------------------------如果把int *p=(int *)5;改成int *p=5或者int *p=&5就會報錯.在這里int *p=&5,有些網友就誤以為常量是沒有地址的,也就是沒有內存的。我認為這種說法是錯誤的。上面我已經講過,有些常量存在于特殊的常量存儲區,或者存在于寄存器中,。常量是不能取到地址的,就算取得到也是沒有意義的。int *p=5報錯,因為指針變量和常量兩者的數據類型不一樣。一個是int*,一個是const int.
所以int *p=(int *)5;是把普通的常量強制轉換成返回整型數據的指針。
新聞熱點
疑難解答