c++中援用和指針的差別和接洽。本站提示廣大學習愛好者:(c++中援用和指針的差別和接洽)文章只能為提供參考,不一定能成為您想要的結果。以下是c++中援用和指針的差別和接洽正文
C++中的援用和指針
★ 雷同點: 1. 都是地址的概念;
指針指向一塊內存,它的內容是所指內存的地址;援用是某塊內存的別號(java中的援用其實也是別號的意思)。
★ 差別: 1. 指針是一個實體,而援用僅是個體名;
2. 援用應用時無需解援用(*),指針須要解援用;
3. 援用只能在界說時被初始化一次,以後弗成變;指針可變; 援用“從一而終”
4. 援用沒有 const,指針有 const,const 的指針弗成變;
5. 援用不克不及為空,指針可認為空;
6. “sizeof 援用”獲得的是所指向的變量(對象)的年夜小,而“sizeof 指針”獲得的是指針自己(所指向的變量或對象的地址)的年夜小;typeid(T) == typeid(T&) 恆為真,sizeof(T) == sizeof(T&) 恆為真,然則當援用作為成員時,其占用空間與指針雷同(沒找到尺度的劃定)。
7. 指針和援用的自增(++)運算意義紛歧樣;
★ 接洽
1. 援用在說話外部用指針完成(若何完成?)。
2. 對普通運用而言,把援用懂得為指針,不會犯嚴重語義毛病。援用是操作受限了的指針(僅允許取內容操作)。
援用是C++中的概念,初學者輕易把援用和指針混雜一路。一下法式中,n 是m 的一個援用(reference),m 是被援用物(referent)。
int m;
int &n = m;
n 相當於m 的別號(綽號),對n 的任何操作就是對m 的操作。例若有人名叫王小毛,他的綽號是“三毛”。說“三毛”怎樣怎樣的,其實就是對王小毛說長道短。所以n 既不 是m 的拷貝,也不是指向m 的指針,其實n 就是m 它本身。
援用的一些規矩以下:
(1)援用被創立的同時必需被初始化(指針則可以在任什麼時候候被初始化)。
(2)不克不及有NULL 援用,援用必需與正當的存儲單位聯系關系(指針則可所以NULL)。
(3)一旦援用被初始化,就不克不及轉變援用的關系(指針則可以隨時轉變所指的對象)。
以下示例法式中,k 被初始化為i 的援用。語句k = j 其實不能將k 修正成為j 的援用,只是把k 的值轉變成為6。因為k 是i 的援用,所以i 的值也釀成了6。
int i = 5;
int j = 6;
int &k = i;
k = j; // k 和i 的值都釀成了6;
下面的法式看起來象在玩文字游戲,沒有表現出援用的價值。援用的重要功效是傳遞函數的參數和前往值。C++說話中,函數的參數和前往值的傳遞方法有三種:值傳遞、 指針傳遞和援用傳遞。
以下是“值傳遞”的示例法式。因為Func1 函數體內的x 是內部變量n 的一份拷貝,轉變x 的值不會影響n, 所以n 的值依然是0。
void Func1(int x)
{
x = x + 10;
}
int n = 0;
Func1(n);
cout << “n = ” << n << endl;// n = 0
以下是“指針傳遞”的示例法式。因為Func2 函數體內的x 是指向內部變量n 的指 針,轉變該指針的內容將招致n 的值轉變,所以n 的值成為10。
void Func2(int *x)
{
(* x) = (* x) + 10;
}
⋯
int n = 0;
Func2(&n);
cout << “n = ” << n << endl; // n = 10
以下是“援用傳遞”的示例法式。因為Func3 函數體內的x 是內部變量n 的援用,x 和n 是統一個器械,轉變x 等於轉變n,所以n 的值成為10。
void Func3(int &x)
{
x = x + 10;
}
⋯
int n = 0;
Func3(n);
cout << “n = ” << n << endl; // n = 10
比較上述三個示例法式,會發明“援用傳遞”的性質象“指針傳遞”,而書寫方法象 “值傳遞”。現實上“援用”可以做的任何工作“指針”也都可以或許做,為何還要“援用” 這器械? 謎底是“用恰當的對象做恰到好處的任務”。 指針可以或許毫無束縛地操作內存中的若何器械,雖然指針功效壯大,然則異常風險。 就象一把刀,它可以用來砍樹、裁紙、修指甲、剃頭等等,誰敢如許用? 假如切實其實只須要借用一下某個對象的“別號”,那末就用“援用”,而不要用“指針”, 以避免產生不測。好比說,或人須要一份證實,原來在文件上蓋上公章的印子就好了,如 果把取公章的鑰匙交給他,那末他就取得了不應有的權力。
留意:若界說string s1(“abc”);string * p=&s1;那末p值為s1的地址(即指針p內的內容),所以cout<<p1輸入值等於cout<<&s1,;p值為指針p所指地址內寄存的內容,所以cout<<p等於abc;&p為指針p本身自己地點的地址,該地址內寄存的值為所指內容的地址,cout<<&p等於指針p本身地點內存的地址
可敲入以下代碼驗證:(並可驗證“援用弗成變,指針可變”)
#include<string>
#include<iostream>
#include<conio.h>
using namespace std;
void main()
{
string s1("Nancy");
string s2("Clancy");
string &rs=s1;
string *ps=&s1;
cout<<&rs<<" "<<ps<<"\n";
rs=s2;
ps=&s2;
cout<<rs<<" "<<*ps<<"\n";
cout<<&rs<<" "<<&s2<<" "<<ps<<" "<<&ps;
//援用rs的地址同之前雷同,照樣等於s1的地址,未產生轉變,
//而指針ps的地址產生了轉變,且指向了s2,援用rs內的值和
//指針ps所指地址內寄存的值都變成了s2
_getch();
}