A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 chunhuayun 于 2015-9-27 22:34 编辑

一、用数组名访问二维数组
如下图

例如:
  1.   int a[][3] = {1,2,3,4,5,6};
  2.    
  3.     printf("sizeof(a) = %ld\n", sizeof(a));
  4.     printf("sizeof(a[0]) = %ld\n", sizeof(a[0]));
  5.    
  6.     printf("a = %p\n", a);
  7.     printf("a[0] = %p\n", a[0]);
  8.    
  9.    
  10.    
  11.     printf("a[0] + 1 = %p\n", a[0] + 1);
  12.     printf("a + 1 = %p\n", a + 1);
  13.     printf("a[1][0] = %p", &a[1][0]);
复制代码


打印结果:
sizeof(a) = 24
sizeof(a[0]) = 12
a = 0x7fff5fbff8f0
a[0] = 0x7fff5fbff8f0
a[0] + 1 = 0x7fff5fbff8f4
a + 1 = 0x7fff5fbff8fc
a[1][0] = 0x7fff5fbff8fc


结论:
由打印结果可知,虽然a的地址和a[0]的地址是一样的,但是由于sizeof(a) 和sizeof(a[0])不一样,所以a+1和a[0]+1的结果是不一样的。a+ 1表示的是第2行的第一个元素,a[0] + 1表示的是第一行的第二个元素


例2:
  1.     int a[][3] = {1,2,3,4,5,6};
  2.    
  3.     for (int i = 0; i < 2; i++) {
  4.         for (int j = 0; j < 3; j++) {
  5.             printf("%d ", *(a[i] + j));
  6.             //printf("%d ", *(*(a + i) + j));//同上
  7.         }
  8.         printf("\n");
  9.     }
复制代码



打印结果:
1 2 3
4 5 6

二、用普通指针访问数组
这样做本身是不对的,因为,假设定义了一个数组

Int  a[][3] = {1,2,3,4,5,6};用一个int *p = a;来访问数组a。指针应该指向相同类型的变量,
而此处int类型的指针指向了int[][]类型的数组变量。虽然这样做不会报错,但是一般不可取

三、二维数组指针的定义、初始化

1.二维数组指针变量的定义
        1.1  一般形式:
                数据类型 (*指针变量名) [二维数组列数];
        1.2如果要讲二维数组赋给一个指针,应该这样
  1.                 Int a[2][3];
  2.                 Int (*p)[4];  //该语句是定义一个数组指针,指向含4个元素的一维数组
  3.                 P = a;          // 将该二维数组的首地址赋给p, 也就是a[0]或是&a[0][0]
  4.                 P++;            //该语句执行过后,也就是p = p + 1,p跨国行a[0]指向了行a[1]
复制代码


               
        所以数组指针也称为 【指向一维数组的指针】,也称为【行指针】
        
二维数组指针可以替代数组名去使用
        1.3 用法如下
         
  1. int a[][3] = {1,2,3,4,5,6};
  2.             int (*p)[3] = a;
  3.             for (int i = 0; i < 2; i++) {
  4.                 for (int j = 0; j < 3; j++) {
  5.                     printf("%d ", *(*p + j));
  6.                 }
  7.                          p++;
  8.                 printf("\n");
  9.             }
复制代码

        打印结果:
        1 2 3
        4 5 6
        
        
        1.4指针数组和二维数组指针变量的区别
        
  1.         int *p2[2] = {&a[0][0], &a[1][0]};//p2是一个指针数组
复制代码

        区别:二维数组指针是单个变量,其一般形式是“(*变量名)”两边的括号不可少,而指针数组类型表示的是多个指针(一组有序指针)在一般形式“*指针数组名”两边不能有括号,例如:
        Int (*p)[3]表示的是一个指向二维数组的指针变量,该二维数组的列数位3或分解为一位数组的长度位3.而int *p[3]表示的是一个指针数组,表示的3个有序指针。





7 个回复

倒序浏览
同学,有些地方看不明白,例二中的输出函数中*(*a[i]+j)是什么意思,没看懂
回复 使用道具 举报
wwf707542865 发表于 2015-9-27 22:07
同学,有些地方看不明白,例二中的输出函数中*(*a+j)是什么意思,没看懂 ...

a表示的是数组a的第i行的首个元素的地址,a+j表示的是第i行的第j个元素的地址,*(a+j)就是根据地址取a数组第i行的第j个元素的值
回复 使用道具 举报
/Users/apple/Desktop/(3).png     *a ,  a , a[0] , & a[0] , &a[0][0] 地址值为什么都是一样的?

(3).png (105.38 KB, 下载次数: 8)

(3).png
回复 使用道具 举报
回复 使用道具 举报
好贴,顶一下
回复 使用道具 举报
不错支持一下
回复 使用道具 举报
迄今为止,你所取得的最大成就是什么?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马