欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

二维数组

程序员文章站 2022-03-30 15:41:26
二维数组与二级指针 二维数组:数组的数组 二维数组的初始化 很多人觉得很简单,很快告诉我答案是1,不过很可惜错了,答案是2,认真看,花括号里面嵌套的是小括号不是花括号,所以就相当于int a[3][2]={2,4,6}; 二维数组在内存中的储存方式 int a[3][4] 二维数组的地址 &a、&a ......

二维数组与二级指针

二维数组:数组的数组

    二维数组的初始化

    

int a[3][2]={(1,2),(3,4),(5,6)};
printf("a[0][0]=%d\n",a[0][0]);

很多人觉得很简单,很快告诉我答案是1,不过很可惜错了,答案是2,认真看,花括号里面嵌套的是小括号不是花括号,所以就相当于int a[3][2]={2,4,6};


 

    二维数组在内存中的储存方式

    int a[3][4]

   二维数组

    二维数组的地址

    &a、&a[0]、a、*a

    

int a[2][3]={1,2,3,4,5,6};
printf("a_size=%d\n",sizeof(a));
printf("a[0]_size=%d\n",sizeof(a[0]));
printf("a[0][0]_size=%d\n",sizeof(a[0][0]));
printf("&a=%p\n",&a);
printf("&a+1=%p\n",&a+1);
printf("&a[0]=%p\n",&a[0]);
printf("&a[0]+1=%p\n",&a[0]+1);
printf("a=%p\n",a);
printf("a+1=%p\n",a+1);
printf("&a[0][0]=%p\n",&a[0][0]);
printf("&a[0][0]+1=%p\n",&a[0][0]+1);

二维数组

  &a、&a[0]、a、&a[0][0]它们的数值上是相等,但是表示的意义各不相同 

  &a:整个二维数组的首地址,&a+1,加的是sizeof(a)个字节。

  &a[0]:二维数组中大数组的首地址,何为大数组,就是a[0]、a[1],所以&a[0]+1,加的是sizeof(a[0])个字节。

  a:原本以为a是二维数组首元素的首地址,但是错了,它也表示的是二维数组中大数组的首地址,所以a+1,也是加了sizeof(a[0])个字节,把二维数组当作一维数组,只是一维数组中的元素也是一个数组,这样在二维数组中a表示二维数组中大数组的首地址就好理解了。

  &a[0][0]:二维数组中首元素的地址,&a[0][0]+1,加的是sizeof(a[0][0])个字节。

  


 

 

    通过指针操作二维数组

   

int a[2][3]={1,2,3,4,5,6};
int *p=a[0];
//int *p=a; int *p=&a;   报警告,数组名相当于二级指针,p为一级指针。
printf("a[0][0]=%d\n",*p);
printf("a[0][1]=%d\n",*(p+1));
printf("a[1][0]=%d\n",*(p+3));

二维数组

   通过数组名来操作数组

  int a[2][3];

  &a[0]代表的是二维数组大数组的首地址,如果我要打印a[i][j],则我先要找到a[i]的首地址,&a[i]=&a[0]+sizeof(a[0])*i,既&a[i]=&a[0]+sizeof(int)*3*i,找到了a[i]的首地址,再来考虑a[i]中的内容,a[i][j]的地址为:&a[i]+sizeof(int)*j,既&a[i][j]=&a[0]+sizeof(int)*3*i+sizeof(int)*j;换算为指针形式表示为*(*(a+i)+j)

  

int a[2][3]={1,2,3,4,5,6};
printf("a[0][0]=%d\n",**a);
printf("a[1][1]=%d\n",*(*(a+1)+1));

二维数组

这时想到一个问题,上面代码中的*a与*(a+1),代表什么意思?

int a[2][3]={1,2,3,4,5,6};
printf("&a[0]=%p\n",&a[0]);
printf("a=%p\n",a);
printf("*a=%p\n",*a);
printf("&a[1][0]=%p\n",&a[1][0]);
printf("*(a+1)=%p\n",*(a+1));

二维数组

通过查阅资料,发现虽然a与*a的值一样。但是它们的意义不同,a 是数组地址,类型为int (*)[3],*a是元素地址,类型为int *,a比*a多一级解除引用。