int *p[10]與int (*p)[10]的區別

這兩天在學習一些基本複雜類型的確認方法,整理了一下思路及寫下一些心得。現在讓我們一起來看看 int *p[10]與int (*q)[10]這兩個形似心不同的東西的究竟是有一些什麼樣的不同。

 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爲準)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章