2007年第10期
福建电脑
C++程序设计语言中数组和指针的探讨
李阿丽1,王雪雁2,李伟丽3
(1.鲁东大学计算机科学与技术学院鲁东2640252.青岛广播电视大学即墨分校山东青岛266200
3.青岛即墨市大信镇人民政府山东青岛266229
【摘要】:本文介绍了C++程序设计语言中关于数组和指针的一些难点问题,以及两者的一些联系。
【关键词】:数组指针变量地址
C++程序设计语言中的数组和指针是构造数据类型,(它们可以是简单的数据类型,也可以是用户自定义的类型),而且它们之间又存在一些关系,对初学者来说,很好的掌握它们不是一件容易的事情。
1.数组和指针的定义
数组的定义格式为:类型名数组名[整形常量表达式][整形常量表达式]……;
如inta[5];//一维数组
intb[2][3];//二维数组(每一个元素是类型相同、长度相等的一维数组)
常量表达式表示元素的个数,它的值只要是整数或整数子集就行,但不能是变量。如:
intn=100;
inta[n];
虽然,根据上下文,编译似乎已经知道n的值,但编译动作因变量性质而完全不同。变量性质就是具有空间占用的可访问的实体,编译每次碰到一个变量名称就对应一个访问空间的操作。因此,inta[n]实际上要在运行时,才能读取变量n的值,才能确定其空间大小。这与数组定义的编译时确定意义的要求相违背,因而编译时出错。
指针类型变量--能够存放对象地址的变量,简称"指针变量",有不至于混淆的情况下简称指针。如int*p;p即是一个指针变量。通过指针可以实现数组的动态分配。
#include<iostream>
usingnamespacestd;
voidmain()
intn,*p;
cin>>n;
array=newint[n];
……
delete[]p;
}
2.数组的访问
对数组的访问一般采用下面两种形式:
(1)下标形式访问,如a[4],b[0][3];
(2)以指针形式访问。
对于一维数组,数组名是隐含意义的常指针(直接地址),其关联类型是数组元素的类型。例如:inta[5]={1,2,3,4,5};则a=&a[0],即a指向数组的第0个元素,那么通过指针间接的访问这个元素就用*a;同样a+i代表第i个元素的地址,对元素的访问可以用*(a+i)。例如:
#include<iostream>
usingnamespacestd;
voidmain()
{inttotal=0;
intintary[10];
for(inti=0;i<10;i++)
{*(intary+i)=i;
cout<<*(intary+i)<<ends;
}
}
对于一维数组还可以通过指针变量间接的访问数组元素。例如:
inta[10];//a是内存的直接地址
int*p;//p是指针变量
p=a;//p的值是a[0]的地址
cout<<*p;//输出a[0]的值
对于二维数组,二维数组名a是逻辑上的一个二级指针,a[i]是一级指针。用二维数组名引用基本类型时,应当是二级引用,但不能直接把二维数组名赋给二级指针变量,因为不管n维数组,数组名a仅是内存块首地址,代表第0行地址,a+i代表第i行行地址。在行地址前面加*就能表示具体元素的地址。例如:inta[3][5],**p2,*p1;
p1=*a;//OK*a代表第0行第0列元素的地址
p1=a[0];//OKa[0]代表第0行第0列元素的地址
p2=a;//Error
p1=a;//Error
以指针形式访问二维数组的例子如下:
#include<iostream>
usingnamespacestd;
voidmain()
{inta[3][2]={1,2,3,4,5,6};
int*p;
for(p=a[0];p<a[0]+6;p++)
cout<<*p<<"";
cout<<endl;
for(p=*a;p<*a+6;p++)
cout<<*p<<"";
cout<<endl;
for(inti=0;i<3;i++)
{for(intj=0;j<2;j++)
cout<<*(a[i]+j)<<"";
cout<<endl;
}
}
3.指向数组的指针和指针数组
指向数组的指针和指针数组是两个易混淆的概念,对初学者搞清两个概念是掌握好数组和指针的关键。
3.1指向数组的指针
指向数组的指针简称为数组指针,一般地指向二维数组。其定义格式为:
<类型>(*<指针名>=[<大小>]。赋值的时用二维数组的某个行地址(即该行首列地址)赋值。例如:inta[2][4]={1,2,3,4,5,6,7,8};int(*p)[4]=a;存储二维数组还必须保存一些访问数组元素的辅助信息,如:a[0],a[1],a[2]。a即&a[0],a[0]是由4个整数组成的一维数组。数组与指针的等价关系如表1。指向数组的指针的应用的例子如下:
#include<iostream>
usingnamespacestd;
inta[][3]={1,2,3,4,5,6,7,8,9};
voidmain()
{
int(*pa)[3](a);
for(inti=0;i<3;i++)
{
cout<<"\n";
for(intj=0;j<3;j++)
cout<<*(*(pa+i)+j)<<"";
}
cout<<"\n";
}
188
2007年第10期福建电脑
表1数组与指针的等价关系
3.2指针数组
指针数组的元素为指针。说明形式为:类型*标识符[表达式];每个数组元素都是关联类型的指针,对每个元素赋值的时候要用地址。例如:int*pi[3];//数组元素是关联类型为整型的指针,对每个元素赋值要用整形变量的地址。
#include<iostream>
usingnamespacestd;
voidmain()
{inta=11,b=22,c=33,*pi[3];
pi[0]=&a;
pi[1]=&b;
pi[2]=&c;
for(inti=0;i<3;i++)
cout<<*pi[i]<<"";
}
函数指针作为一种数据类型,也可以作为数组的元素类型。例如:
typedefvoid(*MenuFun)();Menufunfun[]={f1,f2,f3};//f1,f2和f3都是函数名(函数名代表函数的地址)。
4.数组作函数参数
数组作为函数参数总结起来有如下几种情况。
4.1形参和实参都用数组
调用函数的实参用数组名,被调用函数的形参用数组,这种调用的机制是形参和实参共用内存中的同一个数组。因此,在被调用函数中了数组中某个元素的值,对调用函数该数组的该元素值也被改变。
#include<iostream>
usingnamespacestd;
voidSum(intarray[],intn)
{
intsum=0;
for(inti=0;i<n;i++)
{
sum+=*array;
array++;
}
一维数组的定义和初始化cout<<sum<<endl;
}
voidmain()
{
inta[10]={1,2,3,4,5,6,7,8,9,10};
Sum(a,10);
}
声明中Sum(intarray[],intn)与Sum(int*array,intn)是等价的,所以在Sum函数中可以用array++。定义的函数Sum()的形参array[]是数组,没有给定大小是因为留给初始化时由实参数组确定。在main()中Sum()的调用表达式中,a是实参,它的大小是由定义时确定为10。
4.2形参和实参都用对应数组的指针
C++中,数组名被规定为一个指针,该指针便是指向该数组的首元素的指针,因为它的值是该数组首元素的地址你考虑事,它是一个常量指针。实际应用中,形参和实参一个用指针,另一个用数组也是可以的。例如:
#include<iostream>
usingnamespacestd;
inta[8]={1,2,3,4,5,6,7,8};
voidfun(int*pa,intn)
{
for(inti=0;i<n-1;i++)
*(pa+7)+=*(pa+i);
}
voidmain()
{
intm=8;
fun(a,m);
cout<<a[7]<<endl;
}
函数fun()的形参pa是一个指向int型变量的指针,本程序让它指向数组a的首元素。调用语句fun(a,m)将数组a的地址传给形参指针pa,则pa指向数组a的首元素,通过指针pa可以在被调用函数fun()中修改数组a中的元素。
4.3实参用数组名形参用引用
由于不能直接定义数组的引用,所以可以先用类型定义语句定义一个int型的数组类型,如typedefintarray[8],然后使用array来定义数组和引用。
#include<iostream>
usingnamespacestd;
typedefintarray[8];
inta[8]={1,3,5,7,9,11,13};
voidfun(array&b,intn)
{
for(inti=0;i<n;i++)
b[7]+=b[i];
}
voidmain()
{intm=8;
fun(a,m);
cout<<a[7]<<endl;
}
在fun()函数中,使用了数组的引用作为形参,调用时实参应该是一个数组名,则形参将是实参的引用。那么在函数fun()中对数组b的操作,就相当于对b所引用的数组a的操作。
数组作为参数传递,是函数调用里面的传址调用和引用调用两种类型,形参的改变将直接影响到实参。
5.总结
C++程序设计语言中的数组和指针的内容是C语言中已有的内容,由于C语言一般是学生刚接触到第一门语言,对这一部分内容掌握的不是非常好,在实际教学中,通过进行总结,综合这两部分内容,重点介绍它们之间的一些联系,学生很好的掌握了这一部分内容,做到了融会贯通,为后面的学习打下了坚实的基础。
参考文献:
1.BjarneStroustrup.TheC++ProgrammingLanguage[M].ChinaMachinePress,2002.
2.郑莉,董渊.C++语言程序设计[M](第3版).北京:清华大学出版社,2003.
3.吕凤翥.C++语言基础教程[M].北京:清华大学出版社,1999.
4.钱能.C++程序设计教程[M].北京:清华大学出版社,1999.
5.钱能.C++程序设计教程[M](第二版).北京:清华大学出版社,2005.
189
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论