詳解c++指標的指標和指標的引用

來源:互聯網
上載者:User

標籤:pos   參數   而且   分享   它的   賦值   sizeof   空間   不為   

指標和引用在C++中很常用,但是對於它們之間的區別很多初學者都不是太熟悉,下面來談談他們2者之間的區別和用法。

1.指標和引用的定義和性質區別:

(1)指標:指標是一個變數,只不過這個變數儲存的是一個地址,指向記憶體的一個儲存單元;而引用跟原來的變數實質上是同一個東西,只不過是原變數的一個別名而已。如:

int a=1;int *p=&a;

int a=1;int &b=a;

上面定義了一個整形變數和一個指標變數p,該指標變數指向a的儲存單元,即p的值是a儲存單元的地址。

而下面2句定義了一個整形變數a和這個整形a的引用b,事實上a和b是同一個東西,在記憶體佔有同一個儲存單元。

(2)可以有const指標,但是沒有const引用;

(3)指標可以有多級,但是引用只能是一級(int **p;合法 而 int &&a是不合法的)

(4)指標的值可以為空白,但是引用的值不能為NULL,並且引用在定義的時候必須初始化;

(5)指標的值在初始化後可以改變,即指向其它的儲存單元,而引用在進行初始化後就不會再改變了。

(6)"sizeof引用"得到的是所指向的變數(對象)的大小,而"sizeof指標"得到的是指標本身的大小;

(7)指標和引用的自增(++)運算意義不一樣;

2.指標和引用作為函數參數進行傳遞時的區別。

(1)指標作為參數進行傳遞:

#include<iostream>using namespace std;void swap(int *a,int *b){  int temp=*a;  *a=*b;  *b=temp;}int main(void){  int a=1,b=2;  swap(&a,&b);  cout<<a<<" "<<b<<endl;  system("pause");  return 0;}

結果為2 1;

用指標傳遞參數,可以實現對實參進行改變的目的,是因為傳遞過來的是實參的地址,因此使用*a實際上是取儲存實參的記憶體單元裡的資料,即是對實參進行改變,因此可以達到目的。

再看一個程式;

#include<iostream>using namespace std;void test(int *p){  int a=1;  p=&a;  cout<<p<<" "<<*p<<endl;}int main(void){    int *p=NULL;    test(p);    if(p==NULL)    cout<<"指標p為NULL"<<endl;    system("pause");    return 0;}

運行結果為:

0x22ff44 1

指標p為NULL

大家可能會感到奇怪,怎麼回事,不是傳遞的是地址麼,怎麼p回事NULL?事實上,在main函數中聲明了一個指標p,並賦值為NULL,當調用test函數時,事實上傳遞的也是地址,只不過傳遞的是指地址。也就是說將指標作為參數進行傳遞時,事實上也是值傳遞,只不過傳遞的是地址。當把指標作為參數進行傳遞時,也是將實參的一個拷貝傳遞給形參,即上面程式main函數中的p何test函數中使用的p不是同一個變數,儲存2個變數p的單元也不相同(只是2個p指向同一個儲存單元),那麼在test函數中對p進行修改,並不會影響到main函數中的p的值。

如果要想達到也同時修改的目的的話,就得使用引用了。

2.將引用作為函數的參數進行傳遞。

在講引用作為函數參數進行傳遞時,實質上傳遞的是實參本身,即傳遞進來的不是實參的一個拷貝,因此對形參的修改其實是對實參的修改,所以在用引用進行參數傳遞時,不僅節約時間,而且可以節約空間。

看下面這個程式:

#include<iostream>using namespace std;void test(int &a){  cout<<&a<<" "<<a<<endl;}int main(void){    int a=1;    cout<<&a<<" "<<a<<endl;    test(a);    system("pause");    return 0;}

輸出結果為: 0x22ff44 1

          0x22ff44 1

再看下這個程式:

這足以說明用引用進行參數傳遞時,事實上傳遞的是實參本身,而不是拷貝。

所以在上述要達到同時修改指標的目的的話,就得使用引用了。

#include<iostream>using namespace std;void test(int *&p){  int a=1;  p=&a;  cout<<p<<" "<<*p<<endl;}int main(void){    int *p=NULL;    test(p);    if(p!=NULL)    cout<<"指標p不為NULL"<<endl;    system("pause");    return 0;}

輸出結果為:0x22ff44 1

         指標p不為NULL

詳解c++指標的指標和指標的引用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.