)
第九章 指針第六節(jié) 數(shù)組的指針和指向數(shù)組指針的指針變量-31. 回顧二維數(shù)組和多維數(shù)組的概念a[3][4]二維數(shù)組a[7][8][9], 三維數(shù)組, 排列方式a[0][0][0]…a[0][0][9], a[0][1][0]…最右側維度變化最快,最左側變化最慢多維數(shù)組以此類推…2. 指向多維數(shù)組的指針和指針變量的探究#includeiostreamintmain(){//可以把a看成是一個一維數(shù)組,這一個一維數(shù)組有三個元素, a[0], a[1], a[2]// 每個元素又是一個包含4個元素的一維數(shù)組//數(shù)組名a,同樣代表數(shù)組首地址, 假設a[0]的地址在1000, a[1]的地址是1016, a[2]的地址是1032inta[3][4];int*p;p(int*)a;//強制類型轉換p(int*)(a1);// 代表第一行首地址,每行有四個元素,每個元素占4個字節(jié),a1要跳過16個字節(jié)// a[0], a[1], a[2]就是個一維數(shù)組名,c語言規(guī)定數(shù)組名代表數(shù)組的首地址//也就是說a[0] a[0][0]pa[0];pa[1];// 第0行第一列元素首地址pa[0][1];//也可以使用p a[0]1;return0;}一些推論(假設數(shù)組首地址為1000)a[0] 等價于 *a, 都是數(shù)組首地址, 則地址為1000a[0]1 等價于 *a1,等價于 a[0][1], 也就是地址為(1004)a[1] 等價于 *(a1), 等價于1016a[1]2 等價于 *(a1)2, 等價于 a[1][2], 地址也就是1024*(a[0]1) 等價于 a[0][1]*(a[1]2) 等價于 a(*(a1)2), 第一行第二列元素值(已哭暈!!)a[i]的性質如果是一維數(shù)組的話,是代表值,是占用實際內存的如果是多維數(shù)組的話,是代表地址,a[i]和a[i]的地址值是一樣的代碼演示#includeiostreamintmain(){inta[3][4];inti,j;for(i0;i3;i){for(j0;j4;j){a[i][j]0;}}int*p;p(int*)(a1);//第1行首地址*p56;p;*p88;for(i0;i3;i){for(j0;j4;j){printf(a[%d][%d]: %d ,i,j,a[i][j]);}}return0;}3. 指針數(shù)組和數(shù)組指針a) 指針數(shù)組#includeiostreamintmain(){// 首先這是個數(shù)組,數(shù)組中有4個元素,每個元素都是個指針,// 所以這相當于定義了4個指針變量// 指針數(shù)組int*p[4];//能引用的下標是0-3inta[3][4];inti,j;for(i0;i3;i){for(j0;j4;j){a[i][j]100;printf(a[%d][%d]: %d ,i,j,a[i][j]);}}printf(\n);p[0]a[0][0];p[1]a[0][1];p[2]a[0][2];p[3]a[0][3];for(i0;i4;i){printf(the value of *p[%d]: %d ,i,*(p[i]));}return0;}b) 數(shù)組指針不太好理解,使用不是很多實例代碼1#includeiostreamintmain(){// 數(shù)組指針,注意括號//這是一個指針變量,用來指向10個元素得的一維數(shù)組int(*p)[10];inta[10];for(inti0;i10;i){a[i]i;}pa;//要用取地址符,否則編譯報錯int*q;q(int*)p;for(inti0;i10;i){printf( value: %d,*q);q;}return0;}實例代碼2#includeiostreamintmain(){int(*p)[10];inta[3][10];inti,j;for(i0;i3;i){for(intj0;j10;j){a[i][j]ij;}}pa;//二維數(shù)組名可以直接賦值給數(shù)組指針int*q;q(int*)p;for(i0;i3;i){for(intj0;j10;j){printf( value: %d ,*q);q;}printf(\n***************************\n);p;}return0;}4. 多維數(shù)組的指針做函數(shù)參數(shù)實際應用,建議參考前面的實例