AutoCAD
3DMAX
C语言
Pro/E
UG
JAVA编程
PHP编程
Maya动画
Matlab应用
Android
Photoshop
Word
Excel
flash
VB编程
VC编程
Coreldraw
SolidWorks
A Designer
Unity3D
AE教程
Delphi
C++
汇编语言
数据结构
软件工程
ASP编程
JSP
JavaScript
XML
SQL Server
ACCESS
MySQL
速读教程
IQ智商
记忆力
口才教程
学习方法
软件工程
ASP编程
JSP
JavaScript
XML
html游戏
ACCESS
MySQL
首页
>
C++
对C/C++中多维数组指针的理解
51自学网
http://www.wanshiok.com
对于多维数组的理解比较困难,这也是由于和一维数组指针含义有冲突造成的,因此对于多维数指针的理解是个比较难,需要反复观察,谨慎使用,如果多维数组的概念不清楚那就需要从C/C++基础学起注意知识的积累!
C 代码
/*程序作者:管宁
所有稿件均有版权,如要转载,请务必著名出处和作者*/
#include
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]的地址赋予指针变量p,条件判断p
{
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
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++的实现
Command模式应用实践
泛型<编程>:volatile——多线程程序员最好的朋友volatile修正
mscorwks.dll在.Net中的地位以及在.Net代码保护方面的应用
C++程序设计之四书五经
C++类对象的复制-拷贝构造函数
C++类对象的拷贝构造函数
Vista后,C++ Builder 2007托管还是原生?
C++的明天——以及明天的明天
上一篇:
C++程序设计从零开始之赋值操作符
下一篇:
对C++程序设计中函数重载的探讨
分享到:
QQ空间
新浪微博
腾讯微博
人人网
网易微博
CAD教程
教师招聘
招聘信息
51自学网 我要自学网视频教程,视频下载 自学网 自学编程网 CAD自学网 PS自学网 www.wanshiok.com
网站地图