c 指標位址 突然改變 C 中的指標用法(一)

2021-10-13 18:40:16 字數 3621 閱讀 3802

在c++中,指標用得比較多,對於裡面眾多的指標用法,不免弄得有些糊塗。現把部分內容展現給大家,希望對大家有所幫助。

c++程式設計重要基礎就是類和物件,物件指標是很重要的一部分,包括指向物件的指標、指向物件成員的指標、this指標、指向物件的常指標、指向常物件的指標等。

1、指向物件的指標

說明:在建立物件時,編譯系統就為每個物件分配一定的儲存空間以存放其成員,不過注意,在一般情況下不同物件的資料儲存單元中存放的資料成員是不相同,而不同物件的函式**卻是相同的,也就是說,它們的函式**是共享的。這時我們可以定義乙個指標變數用來存放物件的指標。

定義指向類物件的指標變數的一般形式是:

類名 *物件指標名;

如對於與個time類物件,我們可以有:

time t;

time *p;

p=&t;

我們就可以通過物件指標訪問物件和物件的成員,假如所定義的類中有資料成員hour、minute、sec,成員函式有gettime(),則

(*p).hour 即為p指向物件中的hour成員,相當於t.hour

(*p).gettime() 即為p指向物件中的成員函式gettime(),相當於t.gettime()

也可以用如下形式:

p->hour 和 p->gettime()和上面是等價的。

2、指向物件成員的指標

(1)指向物件資料成員的指標

在c中我們學過指向普通變數的指標變數,在c++中定義指向物件資料成員的指標變數的方法和定義指向普通變數的指標變數方法相同,其一般形式為:

資料型別名 *指標變數名;

如:int *p;

p=&t.hour; //將物件t的資料成員hour的位址賦給p,p指向t.hour

(2)指向物件成員函式的指標

定義指向物件成員函式的指標變數和定義指向普通函式的指標變數不同。

在定義指向普通函式的指標變數時我們可以這樣定義:

void (*p)();

p=fun;

(*p)(); //呼叫fun函式

函式引數型別及個數要匹配

函式返回值的型別要匹配

所屬的類要匹配

顯然在上面的p與類是無關的。為了滿足第三條,我們可以為指標指定類,故定義指向物件成員函式的指標變數一般形式為:

資料型別(類名::*指標變數名)(參數列列);

可以讓指標指向公用的成員函式,如:

void (time::*p)(); //定義指向time類物件成員函式的指標變數p

p=&time::gettime; //把time類的公用成員函式gettime()位址賦給指標變數p

(t.*p)(); //呼叫time類物件t的成員函式gettime()

指向物件成員函式的指標變數=&類名::成員函式名;

在成員函式名後面沒有"()",如果寫成p=&time::gettime()是錯誤的。[nextp

3、this指標

在每個成員函式中都包含了乙個特殊的指標,稱為this,它是指向本類物件的指標,它的值是當前被呼叫成員函式所在物件的起始位址。之所以有這個指標,是因為為了保證同類的不同物件的成員函式引用的是指定物件中的資料成員,它是系統自動實現的。

如定義乙個求體積的函式

int box::vol()

假如已經定義了物件t,當呼叫成員函式t.vol()時,編譯系統就把物件t的起始位址賦給this指標,於是在成員函式引用資料成員時,根據指標this就可以引用到物件t的資料成員。所以c++把上面的函式處理成

int box::vol()

由於this的值是當前被呼叫成員函式所在物件的起始位址,所以可以寫成

int box::vol()

所以在呼叫成員函式t.vlo()時,實際的呼叫方式為t.vol(&t),不過物件t的位址傳給this指標是由系統自動完成的,不需人為加上。

4、指向物件的常指標

將指向物件的指標變數宣告為const型且進行處始化,這樣指標值始終保持為其初值,不能改變其指向。

如:time t1(8,8,8),t2;

time *const p=&t1; //常指標p指向物件t1

p=&t2; //試圖改變p的指向,非法

由上面我們可以看出定義指向物件的常指標的一般形式為:

類名 *const 指標變數名=物件的起始位址;

注意:指向物件的常指標變數的值不能改變,但可以改變它所指向物件中的資料成員的值。

常指標一般用作函式的引數,這樣就不允許在函式執行過程中改變指標變數的值,使其始終保持指向原來的物件。

5、指向常物件的指標變數

首先回顧一下指向常變數的指標變數,其一般形式為:

const 型別名 *指標變數名;

如:const char *p;

如果乙個變數已經被宣告為常變數,那麼只能用指向常變數的指標變數去指向它,而不能用一般的指標變數。另外,指向常變數的指標變數除了可以指向常變數外,還可以指向未被宣告為const的變數,但也不能通過該指標改變其值。

例如:char c='a' //定義字元變數c,未聲名為const

const char *p; //定義指向常變數的指標變數p

p=&c; //p指向字元變數c

*p='b'; //非法

c='b'; //合法

說明:上例中,指標變數p指向字元變數c,並不說把c也宣告成常變數,而只是說在通過指標變數引用c時,c具有常變數的特徵,其值是不能改變的,但c仍然是乙個普通變數。

在指向常變數的指標中,關於函式形參的指標型別有幾點值得注意:

如果函式形參是非const型指標變數,實參只能用指向非const型指標;如果函式形參是指向const型變數的指標,實參則可以是const型的或非const型的指標變數。換句話說就是指向常變數的指標可以指向const和非const型的變數,而指向非const型變數的指標只能指向非const的變數。

用指標變數作形參時形參和實參的對應關係表

下面說到正題,指向常物件的指標變數和指向常變數指標變數類似。

如果乙個物件已經被宣告為長物件,只能用指向常物件的指標變數指向它,而不能用一般的指標變數指向它。

如果定義了乙個指向常物件的指標變數且使它指向乙個非const的物件,其指向的物件不能通過指標來改變。

如果定義了乙個指向常物件的指標變數,是不能通過它改變所指向的物件的值的,但是指標變數本身的值是可以改變的。

如:time t1(8,8,8),t2; //定義物件

const time *p=&t1; //定義指向常物件的指標p,並使它指向t1

p=&t2; //合法,指標p指向物件t2

所以當我們希望在呼叫函式時物件的值不被修改,我們就可以把形參定義為const型的指標變數,同時用物件的位址作實參(物件可以是const或非const型);當要求物件不僅在呼叫函式中不被改變,而且在程式執行過程中也不發生改變,我們就把它定義為const型。所以指向常物件的指標最常用於函式的引數,以保護形參指標所指向的物件在函式執行過程中不被修改。

以上是我使用c++指標時的記錄,也是對c++指標用法的總結,我想對大家學習c++應該是很有幫助的。

C 指標,位址

include int main cout p endl 011efa1c cout p 0 endl 011efa1c cout p 1 endl 011efa20 cout p 1 endl 011efa20 cout p 1 endl 2 cout p 0 endl 1 cout p endl...

C 指標與位址

指標是一種儲存變數位址的變數,存放在一組連續的儲存單元中 通常是2或4個,後者居多 因為c語言本身的feature就很少,加上指標又非常的高效,指標已然成了c最大的特點。與指標相關的操作符有兩個,分別為 解引用 和 取位址 解引用這個詞比較令人費解,比方存在指標p,p c p中便儲存了 c 的位址,...

C 中列印字元指標的位址

問題描述 今天無意中遇到乙個問題,有如下程式,我想列印兩個物件中的字元指標的位址來驗證系統提供的賦值運算子過載是否是淺拷貝,結果直接cout字元指標輸出的並不是指標的位址而是整個字串,為什麼呢?define crt secure no warnings include include using n...