int _tmain()
{
int x = 20;
int ia[10];
int (*pi)[10];
int *a[10]; //a是一個數組,數組中的每一個元素都是int * 類型的指針
int **arr[10]; //arr是一個數組,數組中的每一個元素都是int ** 類型的指針
int (**def)[10]; //def是一個二級指針,指向一個一維數組,數組中的每一個元素都是int。
int *(*gh)[10]; //gh是一個指針,指向一個一維數組,數組中的元素都是int *
int (*f[10])(); //f是一個數組,含有10個元素,每一個元素都是函數指針(參數爲無,返回值爲int)
int *((*b)[10]); //b是一個指針,指針指向一個一維數組,每一個元素都是一個int *類型的指針
int (*fun)(int); //fun是一個函數指針,參數爲int 返回值爲int
int (*(*F)(int,int))(int); //F是一個函數指針,參數爲int,int,返回值爲一個函數指針,這個函數指針的參數爲int,返回值爲int
/*首先來分解這些定義究竟是什麼意思。
int ia[10]是個簡單的數組,數組中的每一個元素都是int型整數,
int *a[10]是個數組,數組中每一個元素都事int型指針,
int (*pi)[10]是個指針,這個指針指向一個一維數組,數組中的每一個元素都是int型整數。
至於這些都是怎麼判斷出來的呢,其實裏面有個規律,首先找到定義的變量名,而後從變量向右看,如int *a[10]首先找到變量名稱 ‘a',而後看向 a 的右邊是 [10],那麼能夠得出 a 是一個數組且
數組中有10個元素,而後再從變量往左看,a 的左邊是 int *,那麼贊成能夠獲得 a 數組中的元素類型都爲int *,也就是都是int型指針,至此,能夠得出結論,a是一個一維數組,數組中的每一個元素
都是一個int型的指針。
根據這個規律,一條一條來分析上面定義的各變量:
int **arr[10]; 首先找到變量名arr,而後看右邊[10],肯定arr是個數組,再看左邊int **,肯定數組中的元素都是int **型的二級指針。
int (**def)[10]; 首先找到變量def,而後看右邊是個括號,括號優先級大於[],因此先看括號裏面的(**def),首先找到括號中的變量def,而後看右邊,右邊沒有內容,再看左邊**,肯定def是個二級指針,而後再看括號外面,先看右邊[10],是個數組,再看左邊 int,肯定
def是一個二級指針,最終指向的是一個一維數組,數組中的元素都是int型
int *(*gh)[10]; 首先找到變量gh,gh在括號中,先看括號內的(*gh),gh右邊沒有內容,再看左邊*,肯定gh是個指針,再看括號外面,右邊是[10],肯定指針指向的是個數組,再看左邊int *,肯定數組中的元素都是int型的指針
int (*f[10])(); 首先判斷這個定義是一個函數指針的申明,先找到變量f,發現f在括號(*f[10])中,那先判斷括號中的內容,先找變量f,再看右邊是[10],肯定是個數組,再看左邊*,肯定數組中的元素都是指針,再看全局,能夠肯定每一個元素都是一個函數指針,這個函數指針
的參數是無類型,返回值是int型。
到這來咱們就會判斷這些定義到底定義的是些什麼內容了,那接下來的sizeof就好辦了。
int len = 0;
len = sizeof a; //a是數組,長度就是 sizeof(int)*10 = 40
len = sizeof arr; //arr是數組,數組元素都是指針, sizeof(p)*10 = 40, (p表明指針,通常指針的大小都是4字節)
len = sizeof def; //def是指針,指針是大小是 4
len = sizeof gh; //gh是指針,指針長度爲4
len = sizeof f; //f是數組,數組元素是指針,4*10=40
len = sizeof b;
len = sizeof fun;
len = sizeof F;
gh = &a;
b = &a;
for (int i=0;i<10;i++)
{
ia[i] = i+20;
a[i] = new int[10];
*a[i] = i;
arr[i] = &a[i];
}
pi = &ia;
def = π
(*(*def))[3] = 21;
*((*gh)[1]) = 133;
*((*gh)[2]) = 13;
return 0;
}