1、首先讓我們先來看看這兩個變量所佔的字節數吧
int _tmain(int argc, _TCHAR* argv[]) { int *p[10]; int (*q)[10]; printf("%ld %ld\n",sizeof(p),sizeof(q)); return 0; }
調試後發現分別佔的字節爲:
是不是非常神奇呢,現在讓我們一起去一點點發現他們之間的小祕密吧。
2 確認方法
當我們聲明一 int *p;是我們知道 這是一個指針,該指針是指向一個int 類型的變量。
那我們是怎麼來確定的呢?
a、我們聲明的是變量p而不是變量*p。(這一點很重要)
b、變量p離*最近,從而我們確定變量p是一個指針。
c、我們將*p看作一個整體 則就成了 int A,是一個整形變量。從而我們確定變量p的指向是int類型的變量。
3、同樣的複雜類型也是遵循這個方法的
(1)現在讓我們來看看int *p[10]吧。
a、首先我們聲明一個變量p。
b、我們要確定票p究竟是跟*靠的近一些還是跟[]靠的近,這裏要用到優先級。我們知道 對於一個數組int a[10],訪問該數組中的第i個元素可以寫成
a[i]或者*(a+i),從這裏知道[]與取*操作時等效的即他們倆是平級,平級在優先級中是遵循向右看齊的原則。
所以p是離[]近,到此 我們可以確定p是一個數組,他有10個元素。
c、將p[10]看作一個整體的的到 int *A;可知道數組p中的每一個元素是指向一個int 類型的變量的指針。
d、總結:int *p[10]是一個指向整形變量的指針數組。
這樣就能解釋我們上面計算p的字節數是40了,p是一個指向整形變量的指針數組 所以他的字節數爲4*10=40(注意:這裏有些編譯器分配給指針爲8字節,我以爲當前用的visual studio 2012爲準);
(2)再讓我們來看看 int(* q)[10]吧
a、我們聲明瞭一個變量q。
b、由於有()所以q離 *近,可以確定變量q是一個指針。
c、我們把(*q)看成一個整體得 int A[10], 到此我們可以確定 q是一個指向一個int類型的數組的指針。
d、總結:int(* q)[10]是指向一個數組的指針,即數組指針。
既然q是一個指針那麼他的字節數就是4(注意:這裏有些編譯器分配給指針爲8字節,我以爲當前用的visual studio 2012爲準)