9、C語言中二維陣列及陣列名及指向二維陣列的指標變數
阿新 • • 發佈:2019-02-17
#include <stdio.h> #include <stdlib.h> //與二維陣列相關的指標變數([] 比 *優先順序高) //在一般指標變數指向二維陣列,或者n維陣列,要直接操作a[i][j],對指標的操作必須有兩個符號(其中不出現&,如果有&則相應的加上* 的個數): //1、兩個* //2、兩個[] //3、一個* 一個[] //4、有一個*或[ ]代表陣列中某個元素的首地址 //同理n維,或者就是陣列中某些地址而不是陣列中元素的值 int main() { int arr[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};//3行4列,也可以理解成3個長度為4的一維陣列組成 int *p1=arr;//arr代表指向首行的首地址. int *p2=*arr;//元素arr[0][0]的首地址. p2=arr[0];p2=*(arr+0); 相當於 &arr[0][0] printf("陣列所佔位元組數:sizeof(arr)=%d\n",sizeof(arr));//陣列所佔位元組數 int i=0,j=0; printf("&arr=%d,arr=%d\n",arr,&arr);//記憶體地址代表一樣。 printf("================\n"); printf("直接利用陣列名來操作:\n"); for(i=0;i<3;i++) { //記住:[]的優先順序大於* //所有出現*(arr+i)<<==>>arr[i]<<==>>*(arr+i)+0 //所有出現*(arr+i)+j<<==>>arr[i][j]<<==>> printf("第%d行的首地址(相當於&arr[%d]):arr+%d=%d\n",i,i,i,arr+i);//相當於 &arr[i] //第i行了首地址 printf("元素arr[%d][0]的首地址(相當於&arr[%d][0]):*(arr+%d)=%d\n",i,i,i,*(arr+i));//相當於 &arr[i][0] 元素arr[i][0]的首地址 for(j=0;j<4;j++) { printf("元素arr[%d][%d]的首地址(相當於&arr[%d][%d]):*(arr+%d)+%d=%d\n",i,j,i,j,i,j,*(arr+i)+j); printf("元素arr[%d][%d]的值:arr[%d][%d]=%d\n",i,j,i,j,*(*(arr+i)+j)); } printf("================\n"); } //指標p1完全可以和上面一樣的完全操作,但p2有自己的方式,可以自增,減 //記住:[]的優先順序大於* //所有出現*(p+i)<<==>>p[i]<<==>>*(p+i)+0 //所有出現*(p+i)+j<<==>>p[i][j]<<==>> printf("直接利用指標變數名來操作():\n"); for(i=0,j=1,p2=arr[0];p2<arr[0]+sizeof(arr)/sizeof(int);p2++) { printf("元素arr[%d][%d]的首地址:&arr[%d][%d]=%d\n",i,j-1,i,j-1,p2); printf("元素arr[%d][%d]的值:arr[%d][%d]=%d\n",i,j-1,i,j-1,*p2); if(j%4==0) { i++; j=1; printf("================\n"); } else { j++; } } return 0; }
程式輸出結果:陣列所佔位元組數:sizeof(arr)=48&arr=2686668,arr=2686668================直接利用陣列名來操作:第0行的首地址(相當於&arr[0]):arr+0=2686668元素arr[0][0]的首地址(相當於&arr[0][0]):*(arr+0)=2686668元素arr[0][0]的首地址(相當於&arr[0][0]):*(arr+0)+0=2686668元素arr[0][0]的值:arr[0][0]=1元素arr[0][1]的首地址(相當於&arr[0][1]):*(arr+0)+1=2686672元素arr[0][1]的值:arr[0][1]=2