解析C++中指向?qū)ο蟮闹羔樖褂?/h1>
更新時間:2015年09月17日 15:13:12 投稿:goldensun
這篇文章主要介紹了解析C++中指向?qū)ο蟮闹羔樖褂?是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
C++指向?qū)ο蟮某V羔?br />
將指針變量聲明為const型,這樣指針值始終保持為其初值,不能改變。
如:
Time t1(10,12,15),t2; //定義對象
Time * const ptr1; //const位置在指針變量名前面,規(guī)定ptr1的值是常值
ptr1=&t1; //ptr1指向?qū)ο髏1,此后不能再改變指向
ptr1=&t2; //錯誤,ptr1不能改變指向
定義指向?qū)ο蟮某V羔樀囊话阈问綖椋?br />
類名 * const 指針變量名;
也可以在定義指針變量時使之初始化,如將上面第2, 3行合并為:
Time * const ptr1=&t1; //指定ptr1指向t1
請注意,指向?qū)ο蟮某V羔樧兞康闹挡荒芨淖?,即始終指向同一個對象,但可以改變其所指向?qū)ο?如t1)的值。
什么時候需要用指向?qū)ο蟮某V羔樐??如果想將一個指針變量固定地與一個對象相聯(lián)系(即該指針變量始終指向一個對象),可以將它指定為const型指針變量,這樣可以防止誤操作,增加安全性。
往往用常指針作為函數(shù)的形參,目的是不允許在函數(shù)執(zhí)行過程中改變指針變量的值, 使其始終指向原來的對象。如果在函數(shù)執(zhí)行過程中修改了該形參的值,編譯系統(tǒng)就會發(fā)現(xiàn)錯誤,給出出錯信息,這樣比用人工來保證形參值不被修改更可靠。
C++指向常對象的指針變量
為了更容易理解指向常對象的指針變量的概念和使用,首先了解指向常變量的指針變量,然后再進(jìn)一步研究指向常對象的指針變量。下面定義了一個指向常變量的指針變量ptr:
const char *ptr;
注意const的位置在最左側(cè),它與類型名char緊連,表示指針變量ptr指向的char變量是常變量,不能通過ptr來改變其值的。
定義指向常變量的指針變量的一般形式為:
const 類型名 *指針變量名;
幾點說明:
1) 如果一個變量已被聲明為常變量,只能用指向常變量的指針變量指向它,而不能用一般的(指向非const型變量的)指針變量去指向它。如:
const char c[] ="boy"; //定義 const 型的 char 數(shù)組
const char * pi; //定義pi為指向const型的char變量的指針變量
pi =c; //合法,pi指向常變量(char數(shù)組的首元素)
char *p2=c; //不合法,p2不是指向常變量的指針變量
2) 指向常變量的指針變量除了可以指向常變量外,還可以指 向未被聲明為const的變量。此時不能通過此指針變量改變該變量的值。如:
char cl ='a'; //定義字符變量cl,它并未聲明為const
const char *p; //定義了一個指向常變量的指針變量p
p = &cl; //使p指向字符變量cl
*p = 'b'; //非法,不能通過p改變變量cl的值
cl = 'b'; //合法,沒有通過p訪問cl,cl不是常變量
3) 如果函數(shù)的形參是指向非const型變量的指針,實參只能用指向非const變量的指針,而不能用指向const變量的指針,這樣,在執(zhí)行函數(shù)的過程中可以改變形參指針變量所指向的變量(也就是實參指針?biāo)赶虻淖兞?的值。
如果函數(shù)的形參是指向const型變量的指針,在執(zhí)行函數(shù)過程中顯然不能改變指針變量所指向的變量的值,因此允許實參是指向const變量的指針,或指向非const變量的指針。如:
const char str[ ] = "boy"; //str 是 const 型數(shù)組名
void fun( char * ptr) ; //函數(shù)fun的形參是指向非const型變量的指針
fun(str); //調(diào)用fun函數(shù),實參是const變量的地址,非法
因為形參是指向非const型變量的指針變量,按理說,在執(zhí)行函數(shù)過程中它所指向的變量的值是可以改變的。但是形參指針和實參指針指向的是同一變量,而實參是const 變量的地址,它指向的變量的值是不可改變的。這就發(fā)生矛盾。因此C++要求實參用非const變量的地址(或指向非const變量的指針變量)。

上表的對應(yīng)關(guān)系與在(2)中所介紹的指針變量和其所指向的變量的關(guān)系是一致的: 指向常變量的指針變量可以指向const和非const型的變量,而指向非const型變量的指針變量只能指向非const的變量。
以上介紹的是指向常變量的指針變量,指向常對象的指針變量的概念和使用是與此類似的,只要將“變量”換成“對象”即可。
1) 如果一個對象已被聲明為常對象,只能用指向常對象的指針變量指向它,而不能用一般的(指向非const型對象的)指針變量去指向它。
2) 如果定義了一個指向常對象的指針變量,并使它指向一個非const的對象,則其指向的對象是不能通過指針來改變的。如:
Time t1(10,12,15); //定義Time類對象t1,它是非const型對象
const Time *p = &t1; //定義p是指向常對象的指針變量,并指向t1
t1.hour = 18; //合法,t1不是常變量
(* p).hour = 18; //非法,不齙通過指針變量改變t1的值
如果希望在任何情況下t1的值都不能改變,則應(yīng)把它定義為const型,如:
const Time t1(lO,12,15);
請注意指向常對象的指針變量與指向?qū)ο蟮某V羔樧兞吭谛问缴虾妥饔蒙系膮^(qū)別。
Time * const p; //指向?qū)ο蟮某V羔樧兞?
const Time *p; //指向常對象的指針變量
3) 指向常對象的指針最常用于函數(shù)的形參,目的是在保護(hù)形參指針?biāo)赶虻膶ο?,使它在函?shù)執(zhí)行過程中不被修改。
請記住這樣一條規(guī)則: 當(dāng)希望在調(diào)用函數(shù)時對象的值不被修改,就應(yīng)當(dāng)把形參定義為指向常對象的指針變量,同時用對象的地址作實參(對象可以是const或非const型)。如果要求該對象不僅在調(diào)用函數(shù)過程中不被改變,而且要求它在程序執(zhí)行過程中都不改變,則應(yīng)把它定義為const型。
4) 如果定義了一個指向常對象的指針變量,是不能通過它改變所指向的對象的值的,但是指針變量本身的值是可以改變的。
您可能感興趣的文章:- 詳解C++中的成員訪問運(yùn)算符和指針到成員運(yùn)算符
- C++智能指針讀書筆記
- 詳解C++中的this指針與常對象
- 詳解C++中的對象指針與對象數(shù)組
- C++中指針的數(shù)據(jù)類型和運(yùn)算相關(guān)知識小結(jié)
- 淺析C++中的函數(shù)與指針
- 剖析C++編程當(dāng)中指針作為函數(shù)參數(shù)的用法
- 深入解讀C++中的指針變量
- 解析C++中的字符串處理函數(shù)和指針
- 簡單談?wù)凜++ 中指針與引用
- 詳解C++中的指針、數(shù)組指針與函數(shù)指針
- 簡單分析C++指針的操作和運(yùn)算
- C++編程指向成員的指針以及this指針的基本使用指南
相關(guān)文章
-
C語言常用庫函數(shù)的使用及模擬實現(xiàn)詳解例舉
C語言庫函數(shù)是把自定義函數(shù)放到庫里,是別人把一些常用到的函數(shù)編完放到一個文件里,供程序員使用,下面讓我們一起來詳細(xì)了解它 2022-04-04
-
QT設(shè)置widget背景圖片不影響widget內(nèi)其他控件背景的方法
這篇文章主要給大家介紹了關(guān)于QT設(shè)置widget背景圖片不影響widget內(nèi)其他控件背景的方法,軟件的界面為了更直觀或美觀,常常需要通過圖片來表達(dá),需要的朋友可以參考下 2023-06-06
-
一篇文章帶你了解C語言的一些重要字符串與內(nèi)存函數(shù)
這篇文章主要介紹了C語言字符函數(shù)、內(nèi)存函數(shù) 功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下 2021-09-09
-
C語言代碼實現(xiàn)學(xué)生成績管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言代碼實現(xiàn)學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下 2022-06-06
最新評論
C++指向?qū)ο蟮某V羔?br /> 將指針變量聲明為const型,這樣指針值始終保持為其初值,不能改變。
如:
Time t1(10,12,15),t2; //定義對象 Time * const ptr1; //const位置在指針變量名前面,規(guī)定ptr1的值是常值 ptr1=&t1; //ptr1指向?qū)ο髏1,此后不能再改變指向 ptr1=&t2; //錯誤,ptr1不能改變指向
定義指向?qū)ο蟮某V羔樀囊话阈问綖椋?br />
類名 * const 指針變量名;
也可以在定義指針變量時使之初始化,如將上面第2, 3行合并為:
Time * const ptr1=&t1; //指定ptr1指向t1
請注意,指向?qū)ο蟮某V羔樧兞康闹挡荒芨淖?,即始終指向同一個對象,但可以改變其所指向?qū)ο?如t1)的值。
什么時候需要用指向?qū)ο蟮某V羔樐??如果想將一個指針變量固定地與一個對象相聯(lián)系(即該指針變量始終指向一個對象),可以將它指定為const型指針變量,這樣可以防止誤操作,增加安全性。
往往用常指針作為函數(shù)的形參,目的是不允許在函數(shù)執(zhí)行過程中改變指針變量的值, 使其始終指向原來的對象。如果在函數(shù)執(zhí)行過程中修改了該形參的值,編譯系統(tǒng)就會發(fā)現(xiàn)錯誤,給出出錯信息,這樣比用人工來保證形參值不被修改更可靠。
C++指向常對象的指針變量
為了更容易理解指向常對象的指針變量的概念和使用,首先了解指向常變量的指針變量,然后再進(jìn)一步研究指向常對象的指針變量。下面定義了一個指向常變量的指針變量ptr:
const char *ptr;
注意const的位置在最左側(cè),它與類型名char緊連,表示指針變量ptr指向的char變量是常變量,不能通過ptr來改變其值的。
定義指向常變量的指針變量的一般形式為:
const 類型名 *指針變量名;
幾點說明:
1) 如果一個變量已被聲明為常變量,只能用指向常變量的指針變量指向它,而不能用一般的(指向非const型變量的)指針變量去指向它。如:
const char c[] ="boy"; //定義 const 型的 char 數(shù)組 const char * pi; //定義pi為指向const型的char變量的指針變量 pi =c; //合法,pi指向常變量(char數(shù)組的首元素) char *p2=c; //不合法,p2不是指向常變量的指針變量
2) 指向常變量的指針變量除了可以指向常變量外,還可以指 向未被聲明為const的變量。此時不能通過此指針變量改變該變量的值。如:
char cl ='a'; //定義字符變量cl,它并未聲明為const const char *p; //定義了一個指向常變量的指針變量p p = &cl; //使p指向字符變量cl *p = 'b'; //非法,不能通過p改變變量cl的值 cl = 'b'; //合法,沒有通過p訪問cl,cl不是常變量
3) 如果函數(shù)的形參是指向非const型變量的指針,實參只能用指向非const變量的指針,而不能用指向const變量的指針,這樣,在執(zhí)行函數(shù)的過程中可以改變形參指針變量所指向的變量(也就是實參指針?biāo)赶虻淖兞?的值。
如果函數(shù)的形參是指向const型變量的指針,在執(zhí)行函數(shù)過程中顯然不能改變指針變量所指向的變量的值,因此允許實參是指向const變量的指針,或指向非const變量的指針。如:
const char str[ ] = "boy"; //str 是 const 型數(shù)組名 void fun( char * ptr) ; //函數(shù)fun的形參是指向非const型變量的指針 fun(str); //調(diào)用fun函數(shù),實參是const變量的地址,非法
因為形參是指向非const型變量的指針變量,按理說,在執(zhí)行函數(shù)過程中它所指向的變量的值是可以改變的。但是形參指針和實參指針指向的是同一變量,而實參是const 變量的地址,它指向的變量的值是不可改變的。這就發(fā)生矛盾。因此C++要求實參用非const變量的地址(或指向非const變量的指針變量)。
上表的對應(yīng)關(guān)系與在(2)中所介紹的指針變量和其所指向的變量的關(guān)系是一致的: 指向常變量的指針變量可以指向const和非const型的變量,而指向非const型變量的指針變量只能指向非const的變量。
以上介紹的是指向常變量的指針變量,指向常對象的指針變量的概念和使用是與此類似的,只要將“變量”換成“對象”即可。
1) 如果一個對象已被聲明為常對象,只能用指向常對象的指針變量指向它,而不能用一般的(指向非const型對象的)指針變量去指向它。
2) 如果定義了一個指向常對象的指針變量,并使它指向一個非const的對象,則其指向的對象是不能通過指針來改變的。如:
Time t1(10,12,15); //定義Time類對象t1,它是非const型對象 const Time *p = &t1; //定義p是指向常對象的指針變量,并指向t1 t1.hour = 18; //合法,t1不是常變量 (* p).hour = 18; //非法,不齙通過指針變量改變t1的值
如果希望在任何情況下t1的值都不能改變,則應(yīng)把它定義為const型,如:
const Time t1(lO,12,15);
請注意指向常對象的指針變量與指向?qū)ο蟮某V羔樧兞吭谛问缴虾妥饔蒙系膮^(qū)別。
Time * const p; //指向?qū)ο蟮某V羔樧兞? const Time *p; //指向常對象的指針變量
3) 指向常對象的指針最常用于函數(shù)的形參,目的是在保護(hù)形參指針?biāo)赶虻膶ο?,使它在函?shù)執(zhí)行過程中不被修改。
請記住這樣一條規(guī)則: 當(dāng)希望在調(diào)用函數(shù)時對象的值不被修改,就應(yīng)當(dāng)把形參定義為指向常對象的指針變量,同時用對象的地址作實參(對象可以是const或非const型)。如果要求該對象不僅在調(diào)用函數(shù)過程中不被改變,而且要求它在程序執(zhí)行過程中都不改變,則應(yīng)把它定義為const型。
4) 如果定義了一個指向常對象的指針變量,是不能通過它改變所指向的對象的值的,但是指針變量本身的值是可以改變的。
- 詳解C++中的成員訪問運(yùn)算符和指針到成員運(yùn)算符
- C++智能指針讀書筆記
- 詳解C++中的this指針與常對象
- 詳解C++中的對象指針與對象數(shù)組
- C++中指針的數(shù)據(jù)類型和運(yùn)算相關(guān)知識小結(jié)
- 淺析C++中的函數(shù)與指針
- 剖析C++編程當(dāng)中指針作為函數(shù)參數(shù)的用法
- 深入解讀C++中的指針變量
- 解析C++中的字符串處理函數(shù)和指針
- 簡單談?wù)凜++ 中指針與引用
- 詳解C++中的指針、數(shù)組指針與函數(shù)指針
- 簡單分析C++指針的操作和運(yùn)算
- C++編程指向成員的指針以及this指針的基本使用指南
相關(guān)文章
C語言常用庫函數(shù)的使用及模擬實現(xiàn)詳解例舉
C語言庫函數(shù)是把自定義函數(shù)放到庫里,是別人把一些常用到的函數(shù)編完放到一個文件里,供程序員使用,下面讓我們一起來詳細(xì)了解它2022-04-04QT設(shè)置widget背景圖片不影響widget內(nèi)其他控件背景的方法
這篇文章主要給大家介紹了關(guān)于QT設(shè)置widget背景圖片不影響widget內(nèi)其他控件背景的方法,軟件的界面為了更直觀或美觀,常常需要通過圖片來表達(dá),需要的朋友可以參考下2023-06-06一篇文章帶你了解C語言的一些重要字符串與內(nèi)存函數(shù)
這篇文章主要介紹了C語言字符函數(shù)、內(nèi)存函數(shù) 功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09C語言代碼實現(xiàn)學(xué)生成績管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言代碼實現(xiàn)學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06