,C/C++    工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛,C/C++
您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > C/C++ > 正文
对C/C++中多维数组指针的理解
[文章信息]
作者:管宁
时间:2005-04-28
出处:天极网
责任编辑:方舟
[文章导读]
对于多维数组的理解比较困难,这也是由于和一维数组指针含义有冲突造成的
advertisement
热点推荐
· VB实现SQL Server 2000存储过程调用
· Java解析网络数据流的三种特殊方法
· 多媒体教程:网页表单文本域类型
· 体验V5E地形编辑:整体控制
· 打造完美可随意安装的WinXP镜像
[正文]
  对于多维数组的理解比较困难,这也是由于和一维数组指针含义有冲突造成的,因此对于多维数指针的理解是个比较难,需要反复观察,谨慎使用,如果多维数组的概念不清楚那就需要从C/C++基础学起注意知识的积累!

 C 代码 
/*程序作者:管宁 

所有稿件均有版权,如要转载,请务必著名出处和作者*/

 
#include <stdio.h> 
main() 
{ 
 static int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; /* 定义一个3行4列的二维数组 */
 int *p; 
 printf("%d %d\n",a,*a); 
 printf("%d %d\n",a[0],*(a+0)); 
 printf("%d %d\n",&a[0],&a[0][0]); 
 printf("%d %d\n",a[0][0],*(*(a+0)+0)); 
 for (p=a[0];p<a[0]+12;p++) /* 把a[0]的地址赋予指针变量p,条件判断p<a[0]+12表示的是小于最后一个元素的地址; */
 { 
  if((p-a[0])%4==0) /* 利用整数指针变量p减去当前地址判断出是不是已经显示出了四个值,换行回车 */
  { 
   printf("\n"); 
  } 
  printf("%4d",*p); /* 打印出元素的值 */
 } 
 printf("\n"); 
} 
 
/* 
第5行中的a和*a打印出来的值,就会让人弄不明白我们知道数组传递的地址那么a表示这个数组的其实地址为什么*a却不是实际值呢?原因是在多维数组中a+0表示的是第0行的首地址,a+1表示是第一行的首地址,那么*a其实就是*(a+0),那么第一个元素其实是a[0][0]
而*(a+0)仅仅是把一个3行4列的二维数组拆为了三个一维数组,*(a+0)显然表示的不是物理位置也就不可能得到第一个元素的值了,它仅仅是一个内存地址也就是第0行的启始地址,再看8行中的*(*(a+0)+0),它表示的则是第0行第0列个元素的值也就是a[0][0],再次强调*(a+0)表示的是数组第一行的首地址,也就是第二行的*(a+1),而元素值要得到显然就是*(*(a+0)+0)了如果是第0行第1个也就是*(*(a+0)+1)。
*/


  下面这个例子可以帮助我们理解多维数组指针作为函数参数传递的使用方法,通过这段代码可以帮助你更好的理解多位数组指针。

 C 代码 
 
/*程序作者:管宁 

所有稿件均有版权,如要转载,请务必著名出处和作者*/

 
#include <stdio.h> 
 
main() 
{ 
 void search_score(); /* 定义自定义涵数类型为不返回型 */
 void count_avg(); /* 定义自定义涵数类型为不返回型 */
 static float a[3][4]={{97,45.5,66,77},{88,92.5,78.5,66},{83,74.5,92,100}}; /* 输入3个学生的各自4门课的成绩 */
 search_score(a,0); /* 调换自定义涵数显示其中一个同学的各门课成绩 */
 count_avg(*a,12); /* 调换自定义涵数显示3个同学各门课的平均成绩成绩 */
 /* 注意上面的*a其实也就是a[0]或者是&a[0][]0将这行改写成count_avg(a[0],12);或者count_avg(&a[0][0],12)也都是对的 */
} 
 
void search_score(p,n) 
float (*p)[4]; /* 定义一个指针变量p,说明它是一个指向一个包含4个整型变量一维数组的指针 */
int n; /* 定义形式参数n为整形 */
{ 
 int i; /* 定义用于循环的变量i */
 for (i=0;i<4;i++ ) /* 这里循环4次用于打印一个同学的4门课成绩 */
 { 
  printf("%7.2f",*(*(p+n)+i)); 
 } 
 printf("\n"); 
} 
 
void count_avg(p,n) 
float *p; 
int n; 
{ 
 float *p_end; 
 float sum = 0; 
 float avg; 
 p_end = p+n-1; /* 计算出最后一个数组元素的地址 */
 for (;p<=p_end;p++) /* 循环到最后一个元素地址就停止 */
 { 
  sum += *p; 
 } 
 avg = sum/n; 
 printf("avg=%7.2f\n",avg); 
} 
 
/* 
注意此题的意思在于输入3个同4门课的成绩,计算出平均值和显示其中一个同学的4门课成绩,此例是对多维数组指针和多维数组 
的指针作为涵数参数传递的总结,认真联系和体会可以很好的了解多维数组指针的概念到底是什么! 
*/


发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
,C/C++ 相关内容,C/C++ 焦点新闻
  • FVD刺激高清碟机加速商业化 抢占商机最重要
  • 3家搜索引擎集体诉讼8848 吕春维未敢出席
  • 杨元庆:没有准备不会获批的备用方案
  • 军队信息化诞生新领域 电子军务呼之欲出
  • 世界经济论坛公布信息化程度全球最新排名
  • 2004政务绩效评估:政府门户尚处于发展阶段
  • 甲骨文出资5.15亿美元 意图收购RetekInc
  • 技术并购:帮你突破传统增长的“天花板”
  • ,C/C++ Advertisement

    天极无线
    经典名曲 华语流行 欧美风情 人声音效 原声大碟
    你好周杰伦-安又琪
    直线-张韶涵
    天边-张韶涵
    看我72变-蔡依林
    乱世佳人-Twins
    全世界下雨-张娜拉
    我们的爱-飞儿乐队
    分手快乐-梁静茹
    爱在西元前-周杰伦
    三万英尺-迪克牛仔
    爱如潮水-张信哲
    爱情宣言-齐秦
    寻找玛依拉-刀郎
    驼铃-刀郎
    老鼠爱大米-杨臣刚
    功夫主题曲
    仙剑主题曲杀破狼
    天下无贼片尾曲
    冲动的惩罚-刀郎
    情人-刀郎
    爱情-莫文蔚
    挪威的森林-伍佰
    奔跑 - 羽泉
    因为爱 - 羽泉
      ·时尚女人圈
    ·经典影视专集
    ·美女秀场
    ·美丽大自然专题
    ·流行金曲
    ·科幻电影特区
    | 最新推荐
    ·你好周杰伦
    ·杀破狼
    ·寻找玛依拉
    ·孤单公园
    ·男人海洋
    | 魔术铃声
    ·少女丰胸
    ·少妇丰胸
    ·减肥魔铃
    ·增高魔铃
    ·美容魔铃

    今日报价查询 更多报价