指標和引用

2021-10-04 09:33:05 字數 3956 閱讀 9645

4.1.1 宣告乙個指標變數

指標是一種資料型別,基於該型別宣告的變數稱為指標變數,和普通的變數一樣,在使用指標變數之前應先對指標變數進行宣告。

/*型別 *指標變數名,*(指標運算子)表明語句宣告的是乙個指標變數,

型別指定了指標所指向的記憶體單元的資料型別,

該指標對於其他資料型別的記憶體無法訪問。*/

int* pnum;

4.1.2 初始化指標變數

在對指標變數使用**間接引用符(*)**前,一定對其進行初始化,在宣告的同時初始化或賦值,使其有乙個確定的值,對於無處可指的指標變數也要將其初始化為null即0.

4.1.3 指向指標的指標

指標變數也有位址,因此可用乙個指標指向其位址,這稱為指向指標的指標或二級指標。

int num;

int*pn=

#int*

*ppn=

&pn;

在程式執行時申請一塊未命名的記憶體用來儲存變數或者更加複雜的資料結構,並把該記憶體的首位址記錄下來。

string 和vector已經足夠方便,不要給自己挖坑[^1]

4.3.1 使用new 動態記憶體分配

型別名 *指標變數名=

new 型別名;

int

*pnum=

newint

;/*返回指向int型別的指標pnum,並用動態申請記憶體的首位址為pnum同時將其進行初始化,因此,用指標pnum可訪問這塊記憶體區域*/

int

*p2=

newint(0

);//初始化為0

4.3.2 使用delete動態釋放及動態申請的記憶體、

動態申請的記憶體必須由程式設計師釋放。

delete指令會釋放動態申請的記憶體塊,但不會刪除指標本身,還可以將指標重新指向另一塊記憶體區域。

delete 語句不能釋放宣告變數獲得的記憶體。

與宣告獲得的陣列不同,使用new動態申請陣列的元素個數可變。

int i=5;

int*p1=

newint

[i];

4.3.6 動態申請並不一定成功
char

*pc=

newchar[10

];if(pc!=null)

//執行操作

else

//記憶體申請失敗處理

通常在記憶體釋放後,將指標賦值為null,這樣就不會再次釋放已經釋放的記憶體。

4.4.1 常量指標或指標常量

在*的右邊新增const修飾符,所宣告的指標稱為指標常量,即該指標為常量。

int x=0;

int*

const px=

&x;//px的值無法改變,但可通過間接引用改寫px指向的變數。

宣告指標常量時必須對其進行初始化,因為指標常量在宣告完畢無法進行修改,因此,未初始化的指標常量是沒有意義的。

4.4.2 常量指標

將const 放在指標型別之前,使無法通過間接引用改寫指標所指向的變數。

int x=5;

const

int*px=

&x;

禁止間接引用改寫不代表記憶體變數無法改寫,通過變數名訪問和改寫記憶體是合法的。

4.4.3 常量指標常量

int x=5;

const

int*

const px=

&x;

4.5.1 陣列名指標
a[i]==*

(a+i)

;

4.5.3 指向陣列的指標

如果陣列是多維陣列,有兩種指標宣告方式,即普通指標和陣列名方式。

普通指標方式

int sz[2]

[3][

4];int

*pz=sz[0]

[0];

//sz的遍歷過程,多維陣列一維化,對pz指標運算單位為int

for(

int i=

0;i<

2;i++

)for

(int j=

0;j<

3;j++

)for

(int k=

0;k<

4;k++

) cout<<

*(pz+3*

4*i+

4*j+k)

;

陣列名方式

int sz[2]

[3][

4];int

(*pz)[3

][4]

=sz;

//採用陣列名方式宣告指標pz,對pz指標運算單位是[3][4]的二維整型陣列;

for(

int i=

0;i<

2;i++

)for

(int j=

0;j<

3;j++

)for

(int k=

0;k<

4;k++

)

4.5.4 指標陣列

"abcd"是常量字串的位址

char

*c="abcd"

;//"abcd"是常量字串的位址

cout

cout<<

*c;//僅僅輸出指標所指位置的乙個字元

int

*sz[4]

;//int(

*sz)[4

];//定義乙個指向陣列的指標sz,其指向的陣列為大小為4的一維int陣列

對引用的操作與變數直接操作完全一樣

4.6.1 引用的宣告

宣告語句中的初始值必須是乙個變數或另乙個引用。一經宣告,不能修改。

型別識別符號 &引用名=初始值;//&不是取位址符,而是「引用說明符」
4.6.3 引用的使用限制

不能建立陣列的引用

宣告引用的引用是非法的

int

&&refnum=num;

指向引用的指標×

int

&*refpum=num;

指向指標的引用√

int

*&refpum=pnum;

//pnum是乙個int的指標,指標的引用合法

4.6.4 其他(關於指標和引用)
int

&refnum=

*new

int;

//對用new 申請的動態無名實體建立乙個引用

delete

&refnum;

//

​ 兩種情況下,必須用const修飾引用

const

int& refint=9;

//去掉const非法

int x;

const

double

&refdouble=x;

//去掉const非法

對非左值的引用,如常數

型別宣告符與初值型別不一致,但可轉換。

const 修飾的引用是唯讀的無法改寫,更有價值的是函式值的傳遞引用及呼叫。

用的好處就是呼叫函式的時候,不用填寫取位址符&,子函式中也不寫取變數符*,結構體和類不用->取成員。傳遞位址的方式,因為更直觀,不管是在函式內部還是函式被呼叫的地方,一眼就能清楚是否是位址。

指標和引用,const 指標和const 引用

指標和引用是在使用中經常弄混淆的兩個概念。引用 reference 為物件起了另外乙個名字,用符號 表示。name,例如 int i 1024 int ref i 一般在初始化變數時,初始值會被拷貝到新建立的物件中,然而定義引用時,程式把引用和它的初始值繫結 bind 在一起,而不是將初始值拷貝給引...

指標和引用

一 先看一段 include using namespace std void freeptr1 int p1 void freeptr2 int p2 void main 思考 在 freeptr1 和freeptr2 的比較中,你能發現它們的不同點嗎?二 對 進行解釋 include using...

指標和引用

指標與引用看上去完全不同 指標用操作符 和 引用使用操作符 但是它們似乎有相同的功能。指標與引用都是讓你間接引用其他物件。你如何決定在什麼時候使用指標,在什麼時候使用引用呢?首先,要認識到在任何情況下都不能使用指向空值的引用。乙個引用必須總是指向某些物件。因此如果你使用乙個變數並讓它指向乙個物件,但...