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

首頁 > 學院 > 開發設計 > 正文

指針的深入理解(1)

2019-11-09 19:14:30
字體:
來源:轉載
供稿:網友
       關于指針的知識,我整理了筆記。同時參考了《你不再害怕指針》這篇優秀的文章。從最簡單最基本的指針開始,慢慢深入到復雜。在講解指針之前,我是先了解了c/c++中的內存管理知識。這樣有助于加強對指針的知識的深入的理解。關于內存管理,訪問博客:http://blog.csdn.net/chen1083376511/article/details/54930191----------------------------------------------------------------------------------------------------------------------------------------------概念:指針:一塊內存的地址.指針變量:用來保存某變量的地址的變量兩者關系:指針變量里面存的是某變量的地址一般變量和指針變量的區別:一般變量:存放的是數據本身,訪問方式稱為直接訪問方式。指針變量:存放的是數據的地址,訪問方式稱為間接訪問方式。-----------------------------------------------------------------------------------------------------------------------------------------------關于網友們對指針本身是否存在一個地址的問題,頗有爭議。為了解決這個問題,我在vc6.0環境下編譯運行以下段代碼:
#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;是把普通的常量強制轉換成返回整型數據的指針。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 化德县| 瑞金市| 清流县| 攀枝花市| 和平区| 宝坻区| 玉龙| 泽州县| 利川市| 西和县| 枝江市| 林周县| 梁平县| 萨嘎县| 抚顺市| 昌图县| 合水县| 南召县| 沙湾县| 伊金霍洛旗| 津市市| 勃利县| 百色市| 阿勒泰市| 新邵县| 什邡市| 同心县| 尤溪县| 枞阳县| 海安县| 吉安县| 阿巴嘎旗| 海兴县| 威远县| 通州市| 曲水县| 盐源县| 曲水县| 确山县| 遂川县| 平定县|