指針和引用的區(qū)別

指針和引用在C++中很常用,但是對于它們之間的區(qū)別很多人都不是太熟悉,下面來解釋下他們2者之間的區(qū)別和用法。

1.指針和引用的定義和性質區(qū)別:

(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指針"得到的是指針本身的大?。?/p>

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

2.指針和引用作為函數(shù)參數(shù)進行傳遞時的區(qū)別:

(1)指針作為參數(shù)進行傳遞:

#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

用指針傳遞參數(shù),可以實現(xiàn)對實參進行改變的目的,是因為傳遞過來的是實參的地址,因此使用*a實際上是取存儲實參的內存單元里的數(shù)據(jù),即是對實參進行改變,因此可以達到目的。

再看一個程序;

#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;
}

運行結果為:

  0x7fff5fbff5e4 1

  指針p為NULL

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

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

3.將引用作為函數(shù)的參數(shù)進行傳遞:

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

看下面這個程序:

#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;
}

輸出結果為:

      0x7fff5fbff5e4 1

      0x7fff5fbff5e4 1

再看下這個程序:

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

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

#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 "<<p;
    }
    system("pause");
    return 0;
}

輸出結果為:

0x7fff5fbff5e4 1
p不為NULL 0x7fff5fbff5e4
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 指針和引用在C++中很常用,但是對于它們之間的區(qū)別很多初學者都不是太熟悉,下面來談談他們2者之間的區(qū)別和用法。1....
    我家有個小太陽閱讀 341評論 0 2
  • 從概念上講。指針從本質上講就是存放變量地址的一個變量,在邏輯上是獨立的,它可以被改變,包括其所指向的地址的改變和其...
    IvanRunning閱讀 419評論 0 1
  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型。 運用指針編程是C語言最主要的風格之一。利用指針變量可以表示各種數(shù)據(jù)結構; ...
    朱森閱讀 3,615評論 3 44
  • 指針 指針是什么 為了了解指針的概念,我們先來看一個小故事。話說福爾摩斯派華生到威爾爵士居住的城堡去取回一個重要的...
    去留無意hmy閱讀 585評論 0 1
  • 孤是孤單的孤,獨是獨立的獨。 或許你們是真的沒有感受過孤獨。孤獨不是幾個人同行你停下綁鞋帶沒人特意等你,因為如...
    QTM閱讀 522評論 0 1

友情鏈接更多精彩內容