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

首頁 > 編程 > C++ > 正文

詳解C++中指針和引用的區別

2020-01-26 13:28:32
字體:
來源:轉載
供稿:網友

1、指針和引用的本質(是什么)

(1)指針是存放內存地址的一種變量,特殊的地方就在它存放的是內存地址。因此,指針的大小不會像其他變量一樣變化,只跟當前平臺相關――不同平臺內存地址的范圍是不一樣的,32位平臺下,內存最大為4GB,因此只需要32bit就可以存下,所以sizeof(pointer)的大小是4字節。64位平臺下,32位就不夠用了,要想內存地址能夠都一一表示,就需要64bit(但是目前應該沒有這么大的內存吧?),因此sizeof(pointer)是8。
(2)引用的本質是“變量的別名”,就是給變量又重新起了一個名字,既然是“別名”,那么就一定要有本體。

2、聲明和初始化時的區別

指針指向的是一個內存地址, 因此可以指向一塊為0x00000000的地址,聲明時可以暫時不初始化(不推薦),即pointer = NULL;

引用是變量的別名,別名就一定對應著一個“本名”,因此必須在聲明時就初始化,且不能初始化為空。

3、使用時區別

(1)根據聲明和初始化時二者的區別,指針在聲明周期內隨時可能會為Null,所以使用時一定要做檢查,防止出現空指針、野指針的情況;而引用則不用再操這個心,只要初始化了,在哪里都可以直接使用,再也不用擔心它會不會為空什么的了。
(2)指針因為自己存的是一個內存地址,既然可以存初始化(或者賦值)的地址,那么在指針生命周期內就可以存其他的地址,只要你是同一類型(不同類型這個對應的類型偏移不一樣)的變量,對于指針都OK。

引用作為一個變量AA的別名,在它的整個生命周期內,它只能“從一而終”,始終是第一次初始化它的那個變量的別名,在這期間任何對它的操作,都等同于對變量AA的操作。

Talk is cheap,show you my code.

/** 指針和引用的例子 **/  std::string s1 = "蘿卜";  std::string s2 = "青菜";  std::string s3 = "雞蛋";  std::string s4 = "西紅柿";  /** 指針可以初始化為空 **/  std::string *p_Str = NULL;  /** 引用一開始必須初始化 **/  std::string& r_Str = s1;  p_Str = &s2;  std::cout<<"我是指針"<<*p_Str<<std::endl; /** 青菜 **/  std::cout<<"我是引用"<<r_Str<<std::endl; /** 蘿卜 **/  std::cout<<std::endl;  std::cout<<"*********分別修改指針和引用***********"<<std::endl;  /** 分別修改指針和引用 **/  r_Str = s3; /** 試圖讓r_Str為s3的別名 **/  p_Str = &s4; /** p_Str重新指向了s4 **/    std::cout<<"我是指針"<<*p_Str<<std::endl; /** 西紅柿 **/  std::cout<<"我是引用"<<r_Str<<std::endl;  /** 雞蛋 **/  std::cout<<std::endl;  std::cout<<"*********查看剛剛的修改對最初初始化的影響***********"<<std::endl;  /** 貌似成功了,都按照意圖修改了,但是,稍等 **/  std::cout<<"我是s1"<<s1<<std::endl; /** 雞蛋 !!!注意 !!! **/  std::cout<<"我是s2"<<s2<<std::endl; /** 青菜 **/  std::cout<<"我是s3"<<s3<<std::endl; /** 雞蛋 **/  std::cout<<"我是s4"<<s4<<std::endl; /** 西紅柿 **/  /**   發現s1 "蘿卜" 被變成了和s3一樣的"青菜",這也說明了任何對引用的操作都等同于操作原先的變量本身  相比較之下,指針就自由度很高了,想指向誰就指向誰,并不會影響任何之前指向過的變量  驚不驚喜,意不意外 :)  **/

4、總結

一個不大恰當的比喻是,指針就像是一個可以(注意是可以,但未必一定)到處沾花惹草(可以隨時指向任意地址)的“渣男”;而引用則像是一個只能“從一(誰初始化就跟誰)而終”的“老實人”。

另外,根據Scott Meyers在《More Effective C++》上所講,只有當你確定需要一開始就初始化,并且不需要再指向其他類型時 使用引用,否則你都應該使用指針。

小弟認識粗鄙淺薄,有不當之處,請大佬輕拍。

以上所述是小編給大家介紹的C++中指針和引用的區別詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 开远市| 鱼台县| 大英县| 伊春市| 安平县| 都匀市| 孟州市| 兴义市| 宝兴县| 金华市| 宁陵县| 姚安县| 沿河| 方山县| 布拖县| 肥城市| 清镇市| 吉木乃县| 白银市| 新巴尔虎右旗| 吉首市| 东光县| 吴堡县| 肇东市| 呼图壁县| 黄大仙区| 上饶市| 石屏县| 高要市| 锡林郭勒盟| 新绛县| 凤阳县| 龙海市| 德惠市| 津市市| 怀化市| 花莲县| 扎赉特旗| 台湾省| 安庆市| 曲阳县|