指標與引用(C )

2022-03-11 22:55:15 字數 2049 閱讀 1450

溫故而知新,指標和引用的概念,大學時都已熟知,實際用的時候往往又有些疑惑,故深入**一下。

從概念上講。指標從本質上講就是存放變數位址的乙個變數,在邏輯上是獨立的,它可以被改變,包括其所指向的位址的改變和其指向的位址中所存放的資料的改變。

而引用是乙個別名,它在邏輯上不是獨立的,它的存在具有依附性,所以引用必須在一開始就被初始化,而且其引用的物件在其整個生命週期中是不能被改變的(自始至終只能依附於同乙個變數)。

在c++中,指標和引用經常用於函式的引數傳遞,然而,指標傳遞引數和引用傳遞引數是有本質上的不同的:

指標傳遞引數本質上是值傳遞的方式,只不過它所傳遞的是乙個位址值。而值傳遞過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在棧中開闢了記憶體空間以存放由主調函式放進來的實參的值,從而成為了實參的乙個副本。值傳遞的特點是被調函式對形式引數的任何操作都是作為區域性變數進行,不會影響主調函式的實參變數的值。

而在引用傳遞過程中,被調函式的形式引數雖然也作為區域性變數在棧中開闢了記憶體空間,但是這時存放的是由主調函式放進來的實參變數的位址。被調函式對形參的任何操作都被處理成間接定址,即通過棧中存放的位址訪問主調函式中的實參變數。正因為如此,被調函式對形參做的任何操作都影響了主調函式中的實參變數。

引用傳遞和指標傳遞是不同的,雖然它們都是在被調函式棧空間上的乙個區域性變數,但是任何對於引用引數的處理都會通過乙個間接定址的方式操作到主調函式中的相關變數。而對於指標傳遞的引數,如果改變被調函式中的指標位址,它將影響不到主調函式的相關變數。如果想通過指標引數傳遞來改變主調函式中的相關變數,那就得使用指向指標的指標,或者指標引用。

程式在編譯時分別將指標和引用新增到符號表上,符號表上記錄的是變數名及變數所對應位址。指標變數在符號表上對應的位址值為指標變數的位址值,而引用在符號表上對應的位址值為引用物件的位址值。符號表生成後就不會再改,因此指標可以改變其指向的物件(指標變數中的值可以改),而引用物件則不能修改。

最後,總結一下指標和引用的相同點和不同點:

不同點:

引用的主要功能是傳遞函式的引數和返回值。c++語言中,函式的引數和返回值的傳遞方式有三種:值傳遞、 指標傳遞和引用傳遞。

1)以下是「值傳遞」的示例程式。

由於func1 函式體內的x 是外部變數n 的乙份拷貝, 改變x 的值不會影響n, 所以n 的值仍然是0。

void func1(int x) 

int n = 0;

func1(n);

cout

<< 「n = 」 << n << endl;// n = 0

2)以下是「指標傳遞」的示例程式。

由於func2 函式體內的x 是指向外部變數n 的指標,改變該指標的內容將導致n 的值改變,所以n 的值成為10。

void func2(int *x) 

int n = 0;

func2(&n);

cout

<< 「n = 」 << n << endl; // n = 10

3)以下是「引用傳遞」的示例程式。

由於func3 函式體內的x 是外部變數n 的引用,x 和n 是同乙個東西,改變x 等於改變n,所以n 的值成為10。

void func3(int &x) 

int n = 0;

func3(n);

cout

<< 「n = 」 << n << endl; // n = 10

對比上述三個示例程式,會發現「引用傳遞」的性質象「指標傳遞」,而書寫方式象 「值傳遞」。實際上「引用」可以做的任何事情「指標」也都能夠做,為什麼還要「引用」 這東西?

答案是「用適當的工具做恰如其分的工作」。

指標能夠毫無約束地操作記憶體中的如何東西,儘管指標功能強大,但是非常危險。 就象一把刀,它可以用來砍樹、裁紙、修指甲、理髮等等,誰敢這樣用? 如果的確只需要借用一下某個物件的「別名」,那麼就用「引用」,而不要用「指標」, 以免發生意外。比如說,某人需要乙份證明,本來在檔案上蓋上公章的印子就行了,如果把取公章的鑰匙交給他,那麼他就獲得了不該有的權利。

C 指標與引用

include 引用傳遞 int add1 int x,int y 指標傳遞 int add2 int x,int y 值傳遞 int add3 int x,int y void main int a 1 int b a 引用,表示b的引用指向了a 定義引用 開頭 必須賦初值 引用變數不占用記憶體 ...

C 指標與引用

從函式引數傳遞說起 int addition int x,int y int main void duplicate int a,int b int main 按值傳遞,顧名思義,函式形參僅僅得到變數傳來的值,函式的任何操作並不對變數產生任何變化 按位址傳遞,他的定義方式與按值傳遞不一樣 注意其在m...

C 引用與指標

1 引用即給當前物件起了個別名,通過將宣告符寫成 t c的形式來定義引用,其中t是變數名,c是當前物件的名字 修改別名相當於修改當前物件,引用必須初始化,且不能更改指向物件 example int a 10 定義a及初始化 int c a 定義a的引用c cout2 引用不是物件,只是對目前已經存在...