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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lynn010 中级黑马   /  2015-12-30 20:13  /  1054 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 lynn010 于 2016-1-1 14:17 编辑

int a[4][4];int *p[4]={a[0],a[1],a[2],a[3]} ;p指针数组
int (*q)[4]=a; 二维数组指针,是一个指针变量
二者皆可表现二维数组,如上。
一、赋值
指针数组赋值应为一组元素:int *p[4]={a[0],a[1],a[2],a[3]} ;
二维数组指针直接将二维数组名赋值即可:int (*q)[4]=a;
二、表示值
指针数组表示数组元素值的形式:a[j]=*(p+j)
二维数组指针表示数组元素值的形式:a[j]=*(*(q+i)+j) 类比二维数组另一种表达方式 *(*(a+i)+j) 其中a为数组名

三、等级
指针数组内的元素皆为一级指针
二维数组指针为一个二级指针
四、累加

指针数组累加 p=p[0]=a[0]=a;p+1=p[1]=a[1];指针数组p所存储的都是a[4][4]数组的行指针

二维数组指针q=a=a[0];q+1=a[1] 因为指针的长度为8,所以每加1即使增加8个字节,并不以数据类型为准


测试代码:


  1. int a[2][2]={1,2,3,4};
  2. int *p[2]={a[0],a[1]};
  3. int (*q)[2]=a;

  4. printf("print the array a:\n");
  5. for (int i=0; i<2; i++) {
  6.     for (int j=0; j<2; j++) {
  7.         printf("a[%d][%d]=%p\t",i,j,&a[i][j]);
  8.     }
  9.     printf("\n");
  10. }
  11. printf("*p[2]:\n");
  12. /**
  13. *  以下用指针数组输出
  14. */
  15. for (int i=0; i<2; i++) {
  16.     for (int j=0; j<2; j++) {
  17.         printf("a[%d][%d]=%d\t",i,j,*(p[i]+j));
  18.         
  19.     }
  20.     printf("\n");
  21. }
  22. /**
  23. *  以下用二维数组指针
  24. */
  25. printf("*q输出数组a:\n");
  26. for (int i=0; i<4; i++,q++) {
  27.    
  28.     printf("a[%d]=%p\n",i,*q);
  29.    
  30. }
  31.     /**
  32.      *  以下q指针不动,类似数组a方式输出
  33.      */
  34.     q=a;
  35.     printf("*(q+i)+j输出数组a:\n");
  36.     for (int i=0; i<2; i++) {
  37.         for (int j=0; j<2; j++) {
  38.             printf("a[%d][%d]=%p\t",i,j,(*(q+i)+j));
  39.         }
  40.         printf("\n");
  41.     }
复制代码

测试结果如下:



http://blog.csdn.net/linmx000/article/details/50429261

result1.jpg (177.75 KB, 下载次数: 2)

结果

结果

3 个回复

倒序浏览
看完之后懂了
回复 使用道具 举报
不错哟。。。。。。。赞一个
回复 使用道具 举报
赞一下!!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马