#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 s
Press any key to continue.

 

 

9、C语言中二维数组及数组名及指向二维数组的指针变量_数组