C 中的指標與引用

2021-06-21 20:34:05 字數 1571 閱讀 5793

1.物件指標和一般的指標的大小都只與作業系統有關,32位系統就是4位元組,64位就是8位元組 

2.c++ 在建立物件的時候 ,會給物件的每乙個成員變數分配一定的儲存空間,以存放其成員(注意位元組對齊問題)

3.所以乙個物件的大小 就是其成員變數的總大小

4.指向物件成員的指標 

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

cout<<*p<6.定義指向成員函式的指標和定義指向普通函式的指標的方法是不同的。

定義指向普通函式的指標的方法是這樣的:

資料型別名(* 指標變數名)(引數列表);

如:void  (*p)(int n,int m);//p是指向void型函式的指標變數

p=fun;//將fun函式的入口位址賦給指標變數p,p就指向了函式fun

(*p)(a,b);//呼叫fun函式,其中,a,b是實參

而定義乙個指向物件成員函式的指標變數則比較複雜一些。

如果我們直接按照上面的方法定義指標變數,將物件成員函式名賦給指標變數p:

void (*p)();         

p=t1.print();

編譯會出現錯誤

成員函式與普通函式的乙個最根本區別:它是類中的乙個成員。

編譯系統要求上面的複製語句中,指標變數的型別必須與賦值號右側函式的型別相匹配,要求在一下3個方面要匹配:

1.函式引數的型別和引數個數

2.函式返回值的型別

3.所屬的類

前兩個是匹配的,而第三點不匹配。

指標變數p與類無關,而print()卻屬於student類。

要定義指向成員函式的指標變數應該採用以下形式:

void (student::*p)();//定義p為指向student類中公共成員函式的指標變數

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

我們知道,所有的student類例項化得到的物件都是公用乙個成員函式的,所以我們沒有必要指定它是指向那個物件的成員函式的指標,我們只需要定義它是指向該類的成員函式就可以了。

使指標變數指向乙個公用成員函式的一般形式為:

p=&student::print;

指標變數名=&類名::成員函式名;

在使用時,仍然需要將指標放到具體的物件中使用,(*p)的作用等價於print()

7.this指標

每個物件中的資料成員都分別占用儲存空間,如果對同乙個類定義了n個物件,則有n組同樣大小的空間一存放n個物件中的資料成員。

單數不同的物件都呼叫同一段函式**段。

那麼,當不同物件的成員函式引用資料成員時,怎麼能保證引用的是所制定的物件的資料成員呢?

實際上,在每乙個成員函式中,都包含乙個特殊的指標,這個指標的名字是固定的,稱為this指標。

它是指向本類物件的指標,它的值是當前被呼叫的成員函式所在的物件的起始位址。

c++編譯系統會自動處理成:

void student::print(student *this)

即在成員函式的形參表列中增加乙個this指標。在呼叫成員函式stud.print()時,實際上是用以下方式呼叫的:

stud.print(&stud);

C 中的引用與指標

c語言中函式有兩種傳參的方式 傳值和傳址。傳值方式,在函式呼叫過程中會生成乙份臨時變數用形參代替,最終把實參的值傳遞給新分配的臨時變數,即形參。它的優點是避免了函式呼叫的 卻無法改變形參的值。如果要改變實參的值,只能通過位址傳參。例如 傳值 void swap int left,int right ...

c 中的指標與引用

引用 不是定義乙個變數,而是給已經存在的變數取乙個別名,所以引用一定要初始化 定義的格式 型別 引用名 已定義過的變數名 引用的特點 1.變數可以有多個別名 2.引用必須要初始化 3.乙個引用不可為多個變數,並且不可變 4.在引用是可以加限制,但不能少限制 乙個例子 int a 100 int b ...

C 中的指標 引用 指標引用

在c 指標的用處很大,可以快讀的訪問位址空間,而且本身不佔太大記憶體。指標操作在引數傳遞的時候非常方便。既可以作為傳入引數,又可以作為返回值。但是可不可作為函式的傳出引數呢?下面通過乙個例子來說明。教室裡面包含多個老師,每個老師管理多個學生 學生類 pragma once include class...