C++中指針VS引用

複合類型

複合類型是指基於其他類型定義的類型,C++語言中主要有引用和指針兩種複合類型。

引用

為對象取了另外一個名字,引用類型引另外一種類型。將通過聲明符寫出&name的形式來定義引用類型,name是聲明變量名。


<code>#include<iostream>
using namespace std;
int main()
{
\tint ival=1024;
\tint &refval=ival;//refval指向ival,是ival的別名
\t//int &refval2;//報錯:引用必須被初始化
\tcout<\tcout<\treturn 0;
}


C++ 學習交流群:875300321/<iostream>/<code>
C++中指針VS引用

一般在初始化變量時,初始值會拷貝到新建的對象中。然而定義引用時,程序把引用和他的初始值綁定在一起,而不是將初始值拷貝給引用。一旦初始化完成,引用將和它的初始值對象一直綁定在一起。因為無法令引用重新綁定到另外一個對象,因此引用必須初始化。

注意:因為引用本身不是一個對象,所以不能定義引用的引用。除此之外還有:


<code>int &refval3=10;//錯誤:引用類型的初始值必須是一個對象
double dval=3.14;
int &refval4=dval;//錯誤,此處引用類型的初始值必須是int對象


C++ 學習交流群:875300321/<code>

指針

指針是指指向另外一種類型的複合類型。與引用類似,指針也實現了對其他對象的間接訪問。然而指針與引用相比又有很多不同點。其一,指針本身就是一個對象。其二,指針無須在定義時賦初值。和其他內置類型一樣,在塊作用域內定義的指針如果沒有被初始化,也將擁有一個不確定的值。

定義指針類型的方法將聲明符寫成*name形式,例如:

<code>int *ip1,*ip2;//ip1和ip2都是指向int型對象的指針
int ival;
int *p=&ival;//賦初始值,p是指向ival對象
int ival1;
p=&ival1;//p也可以改變指向


C++ 學習交流群:875300321/<code>

指針值應屬於下列四種狀態之一:

  1. 指向一個對象。
  2. 指向緊鄰對象所佔空間的下一個位置。
  3. 空指針
  4. 無效指針,上述之外的其他情況。
<code>#include<iostream>
using namespace std;
int main()
{
\tint ival=42;
\tint *p=&ival;
\tcout<\tcout<\tcout<\treturn 0;
}/<iostream>/<code>
C++中指針VS引用

空指針:

  • 空指針不指向任何對象,在試圖使用一個指針之前代碼可以首先檢查它是否為空。以下列舉幾個生成空指針的方法:
<code>int *p1=nullptr;//等價於int *p1=0;
int *p2=0;//直接將p2初始化為字面常量0
int *p3=NULL;//等價於int *p3=0


C++ 學習交流群:875300321/<code>

指向指針的指針:

  • 通過*的個數可以區分指針的級別;
<code>int ival=1024;
int *pi=&ival;//pi指向一個int型的數
int **ppi=π//ppi指向一個int型的指針


C++ 學習交流群:875300321/<code>
C++中指針VS引用

指向指針的引用:

  • 引用本身不是一個對象,因此不能定義指向引用的指針,但是指針是對象,所以存在對指針的引用:
<code>int i=42;
int *p;
int *&r=p;//r是對指針p的引用
r=&i;//r引用了一個指針,因此給r賦值&i就是令p指向i
*r=0;//解引用r得到i,也就是p指向的對象,將i的值改為0


C++ 學習交流群:875300321/<code>

指針和引用作為函數參數傳遞

指針傳遞參數本質上是值傳遞的方式,它所傳遞的是一個地址值。值傳遞過程中,被調函數的形式參數作為被調函數的局部變量處理,即在棧中開闢了內存空間以存放由主調函數放進來的實參的值,從而成為了實參的一個副本。值傳遞的特點是被調函數對形式參數的任何操作都是作為局部變量進行,不會影響主調函數的實參變量的值。(這裡是在說實參指針本身的地址值不會變)

而在引用傳遞過程中,被調函數的形式參數雖然也作為局部變量在棧中開闢了內存空間,但是這時存放的是由主調函數放進來的實參變量的地址(int &a的形式)。被調函數對形參的任何操作都被處理成間接尋址,即通過棧中存放的地址訪問主調函數中的實參變量。正因為如此,被調函數對形參做的任何操作都影響了主調函數中的實參變量。

<code>#include<iostream>
using namespace std;
int main()
{
\tvoid swap1(int *a,int *b);
\tvoid swap2(int &a,int &b);
\tint x=5,y=6;
\tint a=7,b=8;
\tint &m=a,&n=b;
\tswap1(&x,&y);
\tswap2(m,n);
\tcout<\tcout<\treturn 0;
\t
}
void swap1(int *a,int *b)
{
\tint temp=*a;
\t*a=*b;
\t*b=temp;
}
void swap2(int &a,int &b)
{
\tint temp=a;
\ta=b;
\tb=temp;
}

C++ 學習交流群:875300321/<iostream>/<code>


C++中指針VS引用

關注我 小白到大牛之路


分享到:


相關文章: