新浪首页
>
科技时代
>
技术
> 正文
对C/C++中多维数组指针的理解
http://www.sina.com.cn 2005年04月28日 14:26
天极yesky
作者: 管宁
对于多维数组的理解比较困难,这也是由于和一维数组指针含义有冲突造成的,因此对于多维数指针的理解是个比较难,需要反复观察,谨慎使用,如果多维数组的概念不清楚那就需要从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语言
新闻
【
评论
】【
应用软件论坛
】【
大
中
小
】【
打印
】【
下载点点通
】【
多种方式看新闻
】【
收藏
】【
关闭
】
同方携手NBA 精彩让你心动
新浪分类 无限商机
相关链接
轻松应付C语言考试
2004-11-10 10:33:04
水滴石穿C语言之指针、数组和函数
2004-10-15 15:57:40
水滴石穿C语言程序设计之正确使用const
2004-09-17 07:35:08
C语言笔试轻松过—也谈二级C应试技巧
2004-04-09 12:31:55
理论与实践相结合 备战C语言上机考试
2003-09-02 11:36:01
2004年4月二级C语言程序设计笔试真题
2005-01-04 23:01:01
二级C语言程序设计全真标准预测试卷(二)
2005-01-04 22:34:08
二级C语言程序设计全真标准预测试卷(一)
2005-01-04 22:31:31
二级C语言笔试全真模拟试题(二)
2005-01-04 21:45:16
二级C语言笔试全真模拟试题(一)
2005-01-04 21:33:17
水滴石穿C语言之代码检查工具(图)
2004-12-27 16:27:35
二级C语言全真标准预测试卷(二)
2004-11-27 13:56:48
新 闻 查 询
关键词
新闻标题
新闻全文
专题搜索
图片搜索
科技频道
热 点 专 题
2005年上海国际车展
日本谋任常任理事国
圆明园工程风波
定远号舰重返威海
湖南卫视05超级女声
珠峰科考登顶复测
2005环球小姐赛
家装全流程30天攻略
中国特种部队生存
企 业 服 务
投资3万年利高的惊人
开心哈利冰淇淋招商
红日教育计划招商
点!----亿万商机
开园艺花卉店年利50万
韩国女装为何卖疯了?
不需门面一部电话创业
1000个赚钱好项目联展
怎样迅速挖掘网络财富
7天矫正成人畸形牙
糖尿病的终极疗法!!
攻克皮肤白斑外阴白斑
╋鱼鳞病皮肤病新突破
★血管瘤消失的地方
★高血压获重大突破
红色专题
更多>>
[
王 蓉
]
我不是黄蓉
[
张柏芝
]
星语心愿
[
林忆莲
]
至少还有你
[
朴 树
]
生如夏花
[
翻唱原音
]
吻别(摇滚)
图铃狂搜:
更多
>>
恋曲1990
情人
风雨无阻
小薇
至少还有你
爱情真伟大
没你不行
第一次
I Believe
飘摇
一生何求
爱简单
爱的主打歌
那些花儿
勇气
⊙ 分类信息
出口商机,一网打尽!!
老婆日记:他越来越棒
让湿疣、疱疹不再复发
·
做一个县,赚一百万!
·
开千百度特色花店!
·
高血压人要“解放”
·
与狼搏斗的医学泰斗
·
投1.8万办厂利润惊人
·
浪漫小店,月赚8万!
·
湿疣疱疹春光不再!
·
拯救脑萎缩、帕金森
·
老年人用品店隆重招商
·
投资1000元:利润惊人!
·
科技成就糖尿病人健康
·
解救湿疣、疱疹患者
·
开唐林香烧鸡烤鸭店
·
05年全新小本创业项目
·
专家谈银屑病、白斑病
·
专家专治,外阴白斑
科技时代意见反馈留言板
电话:010-82628888-5828 欢迎批评指正
新浪简介
|
About Sina
|
广告服务
|
联系我们
|
招聘信息
|
网站律师
|
SINA English
|
会员注册
|
产品答疑
Copyright © 1996 - 2005 SINA Inc. All Rights Reserved
版权所有
新浪网