c++指針和引用的詳細介紹(指針常量末盔、常量指針)

c++指針和引用的詳細介紹

1筑舅、指針和引用的區(qū)別

  • 指針-對于一個類型T,T就是指向T的指針類型陨舱,也即一個T類型的變量能夠保存一個T對象的地址翠拣,而類型T是可以加一些限定詞的,如const游盲、volatile等等误墓。

  • 引用-引用是一個對象的別名,主要用于函數(shù)參數(shù)和返回值類型益缎,符號X&表示X類型的引用谜慌。

  • (1)引用不可以為空,但指針可以為空链峭。前面也說過了引用是對象的別名畦娄,引用為空——對象都不存在,怎么可能有別名!故定義一個引用的時候熙卡,必須初始化杖刷。

  • (2)引用不可以改變指向,對一個對象"至死不渝"驳癌;但是指針可以改變指向滑燃,而指向其它對象。說明:雖然引用不可以改變指向颓鲜,但是可以改變初始化對象的內(nèi)容表窘。例如就++操作而言,對引用的操作直接反應到所指向的對象甜滨,而不是改變指向乐严;而對指針的操作,會使指針指向下一個對象衣摩,而不是改變所指對象的內(nèi)容昂验。見下面的代碼:

#include<iostream>
using namespace std;

int main(int argc,char** argv)
{
    int i=10;
    int& ref=i;
    ref++;
    cout<<"i="<<i<<endl;
    cout<<"ref="<<ref<<endl;
    int j=20;
    ref=j;
    ref++;
    cout<<"i="<<i<<endl;
    cout<<"ref="<<ref<<endl;
    cout<<"j="<<j<<endl;
    return 0;
}

對ref的++操作是直接反應到所指變量之上,對引用變量ref重新賦值"ref=j"艾扮,并不會改變ref的指向既琴,它仍然指向的是i,而不是j泡嘴。理所當然甫恩,這時對ref進行++操作不會影響到j。而這些換做是指針的話酌予,情況大不相同磺箕,請自行實驗。輸出結果如下:


  • 引用的大小是所指向的變量的大小霎终,因為引用只是一個別名而已滞磺;指針是指針本身的大小,4個字節(jié)莱褒。
int main()
{
    string str = "123456";
    string &str_ref = str;
    string *str_ptr = &str;
    cout<<"str.size = "<<sizeof(str)<<endl;
    cout<<"str_ref.size = "<<sizeof(str_ref)<<endl;
    cout<<"str_ptr = "<<sizeof(str_ptr)<<endl;
}

結果:
str.size = 24
str_ref.size = 24
str_ptr = 8
  • 引用比指針更安全。由于不存在空引用涎劈,并且引用一旦被初始化為指向一個對象广凸,它就不能被改變?yōu)榱硪粋€對象的引用,因此引用很安全蛛枚。對于指針來說谅海,它可以隨時指向別的對象,并且可以不被初始化蹦浦,或為NULL扭吁,所以不安全。const 指針雖然不能改變指向,但仍然存在空指針侥袜,并且有可能產(chǎn)生野指針(即多個指針指向一塊內(nèi)存蝌诡,free掉一個指針之后,別的指針就成了野指針)枫吧。

指針指向一塊內(nèi)存浦旱,它的內(nèi)容是所指內(nèi)存的地址;而引用則是某塊內(nèi)存的別名九杂,引用不改變指向颁湖。

2、常量指針例隆、常量引用甥捺、指針常量

2.1常量指針

常量指針:指向常量的指針,在指針定義語句的類型前加const镀层,表示指向的對象是常量镰禾。

int i = 10;
const int* p = &i;
*p = 20; // 錯誤的

i = 20;
cout << i << endl; // 20
cout << (*p) << endl; // 20

常量指針定義"const int* pointer=&a"告訴編譯器,* pointer是常量鹿响,不能將 * pointer作為左值進行操作羡微。但是可以通過修改i的數(shù)值達到修改*p的數(shù)值。

2.2常量引用

常量引用:指向常量的引用惶我,在引用定義語句的類型前加const妈倔,表示指向的對象是常量。也跟指針一樣不能利用引用對指向的變量進行重新賦值操作绸贡。

int i = 10;
const int& ref = i;
ref = 20; // 錯誤的

i = 20;
cout << ref << endl; // 20

可以將ref理解為一個常量盯蝴,無法直接修改,但是可以通過修改i的數(shù)值來修改ref的數(shù)值

2.3 指針常量

在指針定義語句的指針名前加const听怕,表示指針本身是常量捧挺。在定義指針常量時必須初始化!而這是引用天生具來的屬性尿瞭,不用再引用指針定義語句的引用名前加const闽烙。

int* const p; // 錯誤的,必須在聲明的同時被初始化
int b = 10;
int* const pointer=&b; // 正確
int c = 20;
pointer = &c; // 錯誤
*pointer = c;

c = 30;
cout << b << endl; // 20
cout << *pointer << endl; // 20
cout << c << endl; // 30

指針常量定義"int* const pointer=&b"告訴編譯器声搁,pointer是常量黑竞,不能作為左值進行操作,但是允許修改間接訪問值疏旨,即*pointer可以修改很魂。(pointer是一個固定的地址,不能修改檐涝,但是放在該地址上的數(shù)值可以一直被修改,pointer不能再重新指向別的數(shù)據(jù)了)

2.4 常量指針常量

int c =10;
const int *const pointer=&c;
c =20;
cout << *pointer << endl; // 20

常量指針常量:指向常量的指針常量遏匆,可以定義一個指向常量的指針常量法挨,它必須在定義時初始化。常量指針常量定義"const int* const pointer=&c"告訴編譯器幅聘,pointer和*pointer都是常量凡纳,他們都不能作為左值進行操作。

3.題目

const char * arr = "123";  // 不能修改喊暖, "123"是放在靜態(tài)存儲區(qū)
char * brr = "123";  // 不能修改 "123"放在靜態(tài)存儲區(qū)
const char crr[] = "123";  // 不能修改 (可能放在棧也可能放在靜態(tài)存儲區(qū)惫企,看具體編譯器)
char drr[] = "123"; // 可以修改,放在棧上
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陵叽,一起剝皮案震驚了整個濱河市狞尔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌巩掺,老刑警劉巖偏序,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異胖替,居然都是意外死亡研儒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門独令,熙熙樓的掌柜王于貴愁眉苦臉地迎上來端朵,“玉大人,你說我怎么就攤上這事燃箭〕迥兀” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵招狸,是天一觀的道長敬拓。 經(jīng)常有香客問我,道長裙戏,這世上最難降的妖魔是什么乘凸? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮累榜,結果婚禮上营勤,老公的妹妹穿的比我還像新娘。我一直安慰自己壹罚,他們只是感情好冀偶,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著渔嚷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪稠曼。 梳的紋絲不亂的頭發(fā)上形病,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天客年,我揣著相機與錄音,去河邊找鬼漠吻。 笑死量瓜,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的途乃。 我是一名探鬼主播绍傲,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼耍共!你這毒婦竟也來了烫饼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤试读,失蹤者是張志新(化名)和其女友劉穎杠纵,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钩骇,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡比藻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了倘屹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片银亲。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖纽匙,靈堂內(nèi)的尸體忽然破棺而出务蝠,到底是詐尸還是另有隱情,我是刑警寧澤哄辣,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布请梢,位于F島的核電站,受9級特大地震影響力穗,放射性物質(zhì)發(fā)生泄漏毅弧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一当窗、第九天 我趴在偏房一處隱蔽的房頂上張望够坐。 院中可真熱鬧,春花似錦崖面、人聲如沸元咙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽庶香。三九已至,卻和暖如春简识,著一層夾襖步出監(jiān)牢的瞬間赶掖,已是汗流浹背感猛。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奢赂,地道東北人陪白。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像膳灶,于是被迫代替她去往敵國和親咱士。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 指針和引用形式上很好區(qū)別轧钓,但是他們似乎有相同的功能,都能夠直接引用對象序厉,對其進行直接的操作。但是什么時候使用指針聋迎?...
    代碼人生ll閱讀 411評論 0 0
  • C++是在C語言的基礎上發(fā)展來的脂矫。C++除了有C語言的指針外,還增加一個新的概念——引用霉晕,初學者容易把引用和指針混...
    蕭瀟公舉閱讀 8,517評論 1 5
  • 基本內(nèi)置類型 算術類型字符整型布爾值浮點數(shù) 空類型(void) 算術類型 帶符號類型和無符號類型int牺堰、short...
    2625K閱讀 3,142評論 0 1
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,511評論 1 51
  • 今天請在外面公園隨手拿了一樣子樹葉拄轻,回到課室請孩子們利用在這幾天時間找找和我手上的的桔子樹葉一樣的葉子,每個小孩都...
    考拉的Lily閱讀 302評論 0 0