1. 程式人生 > >9、C語言中二維陣列及陣列名及指向二維陣列的指標變數

9、C語言中二維陣列及陣列名及指向二維陣列的指標變數

#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
元素arr[0][2]的首地址(相當於&arr[0][2]):*(arr+0)+2=2686676元素arr[0][2]的值:arr[0][2]=3元素arr[0][3]的首地址(相當於&arr[0][3]):*(arr+0)+3=2686680元素arr[0][3]的值:arr[0][3]=4================1行的首地址(相當於&arr[1]):arr+1=2686684元素arr[1][0]的首地址(相當於&arr[1][0]):*(arr+1)=2686684元素arr[1][0]的首地址(相當於&arr[1][0]):*(arr+1)+0=2686684元素arr[1][0]
的值:arr[1][0]=5
元素arr[1][1]的首地址(相當於&arr[1][1]):*(arr+1)+1=2686688元素arr[1][1]的值:arr[1][1]=6元素arr[1][2]的首地址(相當於&arr[1][2]):*(arr+1)+2=2686692元素arr[1][2]的值:arr[1][2]=7元素arr[1][3]的首地址(相當於&arr[1][3]):*(arr+1)+3=2686696元素arr[1][3]的值:arr[1][3]=8================2行的首地址(相當於&arr[2]):arr+2=2686700元素arr[2][0]的首地址(相當於&arr[2][0]):*(arr+2)=2686700元素arr[2][0]的首地址(相當於&arr[2][0]):*(arr+2)+0=2686700元素arr[2][0]的值:arr[2][0]=9元素arr[2][1]的首地址(相當於&arr[2][1]):*(arr+2)+1=2686704元素arr[2][1]的值:arr[2][1]=10元素arr[2][2]的首地址(相當於&arr[2][2]):*(arr+2)+2=2686708元素arr[2][2]的值:arr[2][2]=11元素arr[2][3]的首地址(相當於&arr[2][3]):*(arr+2)+3=2686712元素arr[2][3]的值:arr[2][3]=12================直接利用指標變數名來操作():元素arr[0][0]的首地址:&arr[0][0]=2686668元素arr[0][0]的值:arr[0][0]=1元素arr[0][1]的首地址:&arr[0][1]=2686672元素arr[0][1]的值:arr[0][1]=2元素arr[0][2]的首地址:&arr[0][2]=2686676元素arr[0][2]的值:arr[0][2]=3元素arr[0][3]的首地址:&arr[0][3]=2686680元素arr[0][3]的值:arr[0][3]=4================元素arr[1][0]的首地址:&arr[1][0]=2686684元素arr[1][0]的值:arr[1][0]=5元素arr[1][1]的首地址:&arr[1][1]=2686688元素arr[1][1]的值:arr[1][1]=6元素arr[1][2]的首地址:&arr[1][2]=2686692元素arr[1][2]的值:arr[1][2]=7元素arr[1][3]的首地址:&arr[1][3]=2686696元素arr[1][3]的值:arr[1][3]=8================元素arr[2][0]的首地址:&arr[2][0]=2686700元素arr[2][0]的值:arr[2][0]=9元素arr[2][1]的首地址:&arr[2][1]=2686704元素arr[2][1]的值:arr[2][1]=10元素arr[2][2]的首地址:&arr[2][2]=2686708元素arr[2][2]的值:arr[2][2]=11元素arr[2][3]的首地址:&arr[2][3]=2686712元素arr[2][3]的值:arr[2][3]=12================Process returned 0 (0x0)   execution time : 0.897 sPress any key to continue.