黑马程序员技术交流社区

标题: 二维数组 a a[0] a[0][0] &a &a[0] &a[0][0] 区别 [打印本页]

作者: Northcity    时间: 2015-7-22 21:14
标题: 二维数组 a a[0] a[0][0] &a &a[0] &a[0][0] 区别
  1. #include <stdio.h>

  2. int main(int argc, const char * argv[]) {
  3.     int a[2][3]={ 1,2,3,
  4.                   4,5,6
  5.         
  6.     };
  7.     for(int i=0;i<2;i++){
  8.         for(int j=0;j<3;j++)
  9.             printf("a%d%d=%p\t",i,j,&a[i][j]);
  10.         printf("\n");
  11.     }
  12.     //数组名数组首地址是一个指针常量,指针类型是所指向元素的类型,对应第一个元素的地址,数组名加1等于加了一个相应类型的指针
  13.     printf("a地址是:%p\n",a);//数值首地址就是第一个元素地址,二维数组第一个元素是一维数组a[0]
  14.     printf("a[0]地址是:%p\n",a[0]);//一维数组地址就是第一个元素a[0][0]的值 &a[0][0]
  15.     printf("a[0][0]的地址是%p\n",&a[0][0]);
  16.     printf("a+1地址是:%p\n",a+1);//因为二维数组元素是行,所以加1等于加了一行
  17.     printf("a[0]+1地址是%p\n",a[0]+1);//一维数组元素是基本类型int,所以加1 等于加了一个基本类型
  18.     /*数组名虽然是一个指针常量,但是当用在两个地方时不是指针常量
  19.         // 1  sizeof(数组名)   这个计算数组占总字节数
  20.        //  2  &数组名     产生一个指向数组的指针
  21.      */
  22.     printf("&a地址是:%p\n",&a);//产生一个指向二维数组a的指针
  23.     printf("&a[0]地址是:%p\n",&a[0]);//产生一个指向数组a[0]的指针
  24.     printf("&a[0][0]的地址是%p\n",&a[0][0]);//就是元素a[0][0]的地址
  25.     printf("&a+1地址是:%p\n",&a+1);//指向二维数组a的指针加1等于 跨越二维,所以越界
  26.     printf("&a[0]+1地址是%p\n",&a[0]+1);//指向一维数组a[0]指针加1 等于跨越一行
  27.     printf("&a[0][0]+1地址是%p\n",&a[0][0]+1);
  28.     /*
  29.      来看看究极版本
  30.      *(*(a+1)+1)  他得值是多少?,如果知道是多少,指针这里就基本懂了.
  31.      
  32.      // 1   a+1  等于指向达数组第二行的指针
  33.         2   *(a+1) 就是a[1]
  34.         3   a[1]+1   就是   a[1][1]的指针
  35.         4   *(a[1][1])  就是 变量存储值  5
  36.      */
  37.     printf("%d\n",*(*(a+1)+1));
  38.     return 0;
  39. }
复制代码

作者: 原晓桢    时间: 2015-7-22 21:23
然而还是没有看懂
作者: 普通蜗牛    时间: 2015-7-22 21:36
踩一下 表示已阅
作者: 哒哒萌    时间: 2015-7-22 21:42
好像并没有什么区别,值是相等的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2