c++指向物件的常指標
將指標變數宣告為const型,這樣指標值始終保持為其初值,不能改變。
如:time t1(10,12,15),t2; //定義物件
time * const ptr1; //const位置在指標變數名前面,規定ptr1的值是常值
ptr1=&t1; //ptr1指向物件t1,此後不能再改變指向
ptr1=&t2; //錯誤,ptr1不能改變指向
定義指向物件的常指標的一般形式為:
類名 * const 指標變數名;
也可以在定義指標變數時使之初始化,如將上面第2, 3行合併為:
time * const ptr1=&t1; //指定ptr1指向t1
請注意,指向物件的常指標變數的值不能改變,即始終指向同乙個物件,但可以改變其所指向物件(如t1)的值。
什麼時候需要用指向物件的常指標呢?如果想將乙個指標變數固定地與乙個物件相聯絡(即該指標變數始終指向乙個物件),可以將它指定為const型指標變數,這樣可以防止誤操作,增加安全性。
往往用常指標作為函式的形參,目的是不允許在函式執行過程中改變指標變數的值, 使其始終指向原來的物件。如果在函式執行過程式設計客棧程中修改了該形參的值,編譯系統就會發現錯誤,給出出錯資訊,這樣比用人工來保證形參值不被修改更可靠。
c++指向常物件的指標變數
為了更容易理解指向常物件的指標變數的概念和使用,首先了解指向常變數的指標變數,然後再進一步研究指向常物件的指標變數。下面定義了乙個指向常變數的指標變數ptr:
const char *ptr;
注意const的位置在最左側,它與型別名char緊連,表示指標變數ptr指向的char變數是常變數,不能通過ptr來改變其值的。
定義指向常變數的指標變數的一般形式為:
const 型別名 *指標變數名;
幾點說明:
1) 如果乙個變數已被宣告為常變數,只能用指向常變數的指標變數指向它,而不能用一般的(指向非const型變數的)指標變數去指向它。如:
const char c ="boy"; //定義 const 型的 char 陣列
const char * pi; //定義pi為指向const型的char變數的指標變數
pi =c; //合法,pi指向常變數(char陣列的首元素)
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) 如果函式的形參是指向非const型變數的指標,實參只能用指向非const變數的指標,而不能用指向const變數的指標,這樣,在執行函式的過程中可以改變形參指標變數所指向的變數(也就是實程式設計客棧參指標所指向的變數)的值。
如果函式的形參是指向const型變數的指標,在執行函式過程中顯然不能改變指標變數所指向的變數的值,因此允許實參是指向const變數的指標,或指向非const變數的指標。如:
const char str[ ] = "boy"; //str 是 const 型陣列名
void fun( char * ptr) ; //函式fun的形參是指向非const型變數的指標
fun(str); //呼叫fun函式,實參是const變數的位址,非法
因為形參是指向非const型變數的指標變數,按理說,在執行函式過程中它所指向的變數的值是可以改變的。但是形參指標和實參指標指向的是同一變數,而實參是const 變數的位址,它指向的變數的值是不可改變的。這就發生矛盾。因此c++要求實參用非const變數的位址(或指向非const變數的指標變數)。
上表的對應關係與在(2)中所介紹的指標變數和其所指向的變數的關係是一致的: 指向常變數的指標變數可以指向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的值都不能改變,則應把它定義為const型,如:
const time t1(lo,12,15);
請注意指向常物件的指標變數與指向物件的常指標變數在形式上和作用上的區別。
time * const p; //指向物件的常指標變數
const time *p; //指向常物件的指標變數
3) 指向常物件的指標最常用於函式的形參,目的是在保護形參指標所指向的物件,使它在函式執行過程中不被修改。
請記住這樣一條規則: 當希望在呼叫函式時物件的值不被修改,就應當把形參定義為指向常物件的指標變數,同時用物件的位址作實參(物件可以是const或非const型)。如果要求該物件不僅在呼叫函式過程中不被改變,而且要求它在程式執行過程中都不改變,則應把程式設計客棧它定義為const型。
4) 如果定義了乙個指向常物件的指標變數,是不能通過它改變所指向的物件的值的,但是指標變數本身的值是可以改變的。
本文標題: 解析c++中指向物件的指標使用
本文位址: /ruanjian/c/131282.html
C 中指向物件的常指標和指向常物件的指標
將指向物件的指標變數宣告為const型,並使之初始化,這樣指標值始終保持為其初始值,不能改變。time t1 10,12,15 t2 time const ptr1 t1 ptr1 t2 定義指向物件的常指標的一般形式為 類名 const 指標變數 物件位址 注意應該在定義指標變數時使之初始化 指向...
c 中指向函式的指標
函式指標是指指向函式而非指向物件的指標。像其他指標一樣,函式指標也指向某個特定的型別。函式型別由其返回型別以及形參表確定,而與函式名無關。int pi const string const string 這個語句將pi申明為指向函式的指標,它所指向的函式帶有兩個const string 型別的形參和...
C 中 指向指標的指標「作用與應用
c 中乙個指標的使用就已經讓很多人欲哭無淚,可是更不幸的是他還有指向指標的指標。指向指標的指標有時候還是非常有用的,我們這節就來介紹一下,指向指標的指標有什麼妙用。這是乙個最常見的應用,比如 include intfind char s,char src,char rt 從s中查詢出src字元所在的...