關於指標的基本概念,我就不詳細介紹了,因為有許多書都介紹的很詳細。這裡我只介紹一部分。指標指向一個地址,而指標本身在大多數系統上都是一個無符號整數(在32bit機上是4byte,在64bit機上是8byte)。
下面用一個例子來說明其機制:
在上面的例子中,先定義了一個指標p,它的型別是int,也就是說它只能指向一個int型的變數,而不能指向其他型別的變數。最後我們將a變數的地址賦給p。在這個過程中,涉及到兩個記憶體塊,一個是存放指標p的記憶體(用&p可得到記憶體地址),一個是存放a的值的記憶體塊(用&a可以得到記憶體地址)。而第一個記憶體存的'p的值經過賦值語句後也就是&a的值了。另外一個注意點是, *(星號)和變數型別以及變數名之間可以有任意個空格,也可以沒有。比如下面三種方式都是一樣的:
int a = 10;
int *p; //宣告一個指標,但未初始化,此時為野指標
p = &a; //將a變數的地址賦給指標p
在上面的例子中,先定義了一個指標p,它的型別是int,也就是說它只能指向一個int型的變數,而不能指向其他型別的變數。最後我們將a變數的地址賦給p。在這個過程中,涉及到兩個記憶體塊,一個是存放指標p的記憶體(用&p可得到記憶體地址),一個是存放a的值的記憶體塊(用&a可以得到記憶體地址)。而第一個記憶體存的p的值經過賦值語句後也就是&a的值了。另外一個注意點是, *(星號)和變數型別以及變數名之間可以有任意個空格,也可以沒有。比如下面三種方式都是一樣的:
int* a;
int * a;
int *a;
解讀方法:
首先從標示符開始閱讀,然後往右讀,每遇到圓括號的右半邊就調轉閱讀方向。重複這個過程直到整個宣告解析完畢。需要注意的是,已經讀過的部分在後續作為一個整體來看。
看下面一個例子:
int *a[3];
//首先a右邊是[],說明a是一個具有3個元素的陣列
//右邊讀完,則讀左邊。a左邊是int*,說明a的元素是int型別的指標
int (*a)[3]
//首先,a右邊是圓括號的右半邊,轉向,左邊是一個*,說明a是一個指標
//遇到括號,再轉向,是一個[],說明a是一個指向3個元素的陣列的指標
//左邊是int,說明元素型別是int
//所以,a是一個指向具有3個整型元素的陣列的指標
int (*func)(int p);
//相同的方法,func首先是一個指標
//然後右邊是一個括號,說明(func)是個函式,而func是指向這個函式的指標
//這個函式具有int型別的引數,返回值型別為int
int (*func[3])(int p);
//同理,func首先是一個具有3個元素的陣列
//其次,func左邊是一個*,說明func陣列的元素是指標。要注意修飾的是func[3],而不是func。因為已經讀過的部分在後面都作為一個整體來對待
//跳出第一個圓括號,右邊又是一個圓括號,說明func陣列的元素是函式型別的指標。這個函式具有int型別的引數和int型返回值