1. 程式人生 > 其它 >(mit) 關於int *a; int &a; int & *a; int * &a

(mit) 關於int *a; int &a; int & *a; int * &a


a) int a;表示一個記憶體空間,這個空間用來存放一個整數(int);
b) int* a;表示一個記憶體空間,這個空間用來存放一個指標,這個指標指向一個存放整數的空間,即a)中提到的空間;
c) int** a;表示一個記憶體空間,這個空間用來存放一個指標,這個指標指向一個存放指標的空間,並且指向的這個空間中的指標,指向一個整數。也簡單的說,指向了一個b)中提到的空間;
d) int (*a)[10];表示一個記憶體空間,這個空間用來存放一個指標,這個指標指向一個長度為10、型別為int的陣列;和int** a的區別在於,++、+=1之後的結果不一樣,其他用法基本相同。
以上四種類型見上圖表示。
e) int (*a)(int);表示一個記憶體空間,這個空間用來存放一個指標,這個指標指向一個函式,這個函式有一個型別為int的引數,並且函式的返回型別也是int。

上述的四條語句,前面兩個很好理解,而後面兩個,大部分C++初學者都會比較困惑,今天我也是查閱了一些資料以後才恍然大悟。下面具體來說明一下:

int i;

int *a = &i;//這裡a是一個指標,它指向變數i

int &b = i;//這裡b是一個引用,它是變數i的引用,引用是什麼?它的本質是什麼?下面會具體講述

int * &c = a;//這裡c是一個引用,它是指標a的引用

int & *d;//這裡d是一個指標,它指向引用,但引用不是實體,所以這是錯誤的

先是第一個問題:引用的本質是什麼?

引用就是指標,兩者沒有區別。我們可以把引用想象成一個不需要"*"就可以訪問變數的指標,對比如下程式:

void function(int *a)

{
*a = 100;
}

int main()

{
int x=200;

int *b = &x;

function(b);

return(0);
}


void function(int &a)

{
a = 100;
}

int main()

{
int x = 200;

function(x);

return(0);
}

以上兩段程式完成的功能是一樣的。

第二個問題:int * &a和int & *a

我在寫這兩句語句時,在int 和*(&)間空了一格,而後面的&(*)緊跟a。原因是:分析此類語句時,先看a前緊跟的是什麼,它決定了a的型別。而int後的一個空格是為了防止int *a, b;//a是指標,而b不是。

其他:int * *a;

它的功能和int * &a一樣,兩者生成的二進位制程式碼一樣。這再一次說明了引用就是指標。

以上如果有什麼錯誤或什麼建議,忘高手們指出哈!呵呵