C語言,數組-指針測試

// 目的:    測試 數組名、指針值、指針變量  的關係 數組

// 測試環境: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個字節

}

相關文章
相關標籤/搜索