// 目的: 測試 數組名、指針值、指針變量 的關係 數組
// 測試環境:VC6.0 測試
// 時間: 2011.12.22 spa
// 修改時間 2013-04-15 指針
// 說明:退化 —— C標準規定的轉換 io
// 行指針—— 一維數組指針 變量
// 頁指針—— 二維數組指針 im
#include<stdio.h> d3
main() 二維數組
{ di
int a0 = 1;
int b1[3] = {2,3,4};
int c2[3][3] = {5,6,7,8,9,10,11,12,13};
int d3[3][3][3] = {14,15,16,17,18,19,20,21,22,
23,24,25,26,27,28,29,30,31,
32,33,34,35,36,37,38,39,40};
int *ap0;
int (*bp1)[3]; // 一維指針變量定義
int (*cp2)[3][3]; // 二維指針變量定義
int (*dp3)[3][3][3]; // 三維指針變量定義
// 一維數組
a0 = b1[1]; // 下標運算符 [] 至關於 *(),即等價於 a0 = *(b+1),b1[1]表示第一個元素, 類型是 int
ap0 = b1; // 一維數組名「退化」成一維數組元素指針,b1 表示第一個元素的指針,類型是 int *
ap0 = (b1+1); // 加1的「步長」是 sizeof(int)
bp1 = &b1; // &b是一維數組指針,表示第一行指針,類型是 int * [3]
bp1 = &b1+1; // 加1的「步長」是 sizeof(int)*3
// 二維數組
bp1 = c2; // 二維數組名「退化」成一維數組指針,類型是 int * [3]
bp1 = (c2+1); // 加1的「步長」是 sizeof(int)*3
ap0 = c2[1]; // 下標運算符 [] 至關於 *(),即等價於 *(c2+1),至關於一維數組名
// 自動「退化」成一維數組元素指針,c2[1]表示類型是第二行第一個元素的指針,類型是 int *
ap0 = c2[1]+1; // 加1的「步長」是 sizeof(int)
bp1 = &c2[1]; // 下標運算符 [] 至關於*(),[] 優先級高於 &,即等價於 &(*(c2+1))取一維數組的地址
// &c2[1]表示第二行行指針,類型是 int * [3]
bp1 = &c2[1]+1; // 加1的「步長」是 sizeof(int)*3
cp2 = &c2; // 取二維數組地址,獲得二維數組指針,&c2類型是int * [3][3]
cp2 = &c2+1; // 加1的「步長」是 sizeof(int)*3*3
// 三維數組
cp2 = d3; // 三維數組名「退化」成二維數組指針,類型是 int * [3][3]
bp1 = *d3; // d3進行運算首先「退化」,再進行指針運算,值等價於 一維數組名
ap0 = **d3; // 至關於整形指針,可是不能當作左值,即不能自加
cp2 = d3+1; // 加1的「步長」是 sizeof(int)*3*3
bp1 = d3[1]; // 下標運算符 [] 至關於 *(),即等價於 *(d3+1),至關於二維數組名
// 自動「退化」成一維數組指針,c2[1]表示第二頁第一行的行指針,類型是 int *[3]
bp1 = d3[1]+1; // 加1的「步長」是 sizeof(int)*3
cp2 = &d3[1]; // 下標運算符 [] 至關於*(),[] 優先級高於 &,即等價於 &(*(d3+1))取二維數組的地址
// &c2[1] 表示第二頁的頁指針,類型是 int * [3][3]
cp2 = &d3[1]+1; // 加1的「步長」是 sizeof(int)*3*3
dp3 = &d3; // 取三維數組地址,獲得三維數組指針,&d3類型是int * [3][3][3]
dp3 = &d3+1; // 加1的「步長」是 sizeof(int)*3*3*3
printf("%d\n",sizeof(ap0)); // 4 指針變量
printf("%d\n",sizeof(bp1)); // 4 指針變量
printf("%d\n",sizeof(cp2)); // 4 指針變量
printf("%d\n",sizeof(dp3)); // 4 指針變量
printf("%d\n",sizeof(b1)); // 3*4 是一維數組名
printf("%d\n",sizeof(b1+1)); // 4
printf("%d\n",sizeof(c2)); // 3*3*4 是二維數組名
printf("%d\n",sizeof(c2+1)); // 4
printf("%d\n",sizeof(d3)); // 3*3*3*4 是三維數組名
printf("%d\n",sizeof(d3+1)); // 4
printf("%d\n",sizeof(&b1)); // 3*4 一維數組指針
printf("%d\n",sizeof(&b1+1)); // 4
printf("%d\n",sizeof(&c2)); // 3*3*4 二維數組指針
printf("%d\n",sizeof(&c2+1)); // 4
printf("%d\n",sizeof(&d3)); // 3*3*3*4 三維數組指針
printf("%d\n",sizeof(&d3+1)); // 4
printf("%p\n",d3); // 三維數組的第一頁,頁指針 int *[3][3]
printf("%p\n",d3+1); // 三維數組的第二頁,頁指針 int *[3][3]
printf("%p\n",&d3); // 三維數組 int *[3][3][3]
printf("%p\n",&d3+1); // 三維數組 int *[3][3][3]
printf("%p\n",*(d3+1)); // 三維數組的第二頁第一行,行指針 int * [3]
printf("%p\n",*(d3+1)+1); // 三維數組的第二頁第二行,行指針 int * [3]
printf("%p\n",*(*(d3+1)+1)); // 三維數組的第二頁第二行第一個元素,整形指針 int *
printf("%p\n",*(*(d3+1)+1)+1); // 三維數組的第二頁第二行第二個元素,整形指針 int *
printf("%d\n",*(*(*(d3+1)+1)+1)); // 三維數組的第二頁第二行第二個元素 int
// printf("%p\n",d3++); // 數組名不能當左值,故而不能自加
// printf("%p\n",(*d3)++); // * 優先級小於 ++,(*d3)等價於 一維數組名不能當左值,故而不能自加
// printf("%p\n",(**d3)++); // (**d3),等價於數組名不能當左值,故而不能自加
printf("%p\n",(***d3)++); // (***d3) 等價於整形變量
//結論:1.數組名 參加運算(賦值、加減) 會變爲 下降一維度 的指針值
// 2.數組名 進行 & 運算,獲得 本維度 的指針
// 3.sizeof對數組名進行操做,獲得數組大小
// 4.任何類型的指針都是4個字節
}