开放专科c++ 语言要使指针变量p指向个维数a的,C++数组与指针

指向数组元素的指针

一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。所谓数组元素的指针就是数组元素的地址。

int a[10];   //定义一个整型数组a,它有10个元素

int *p;  //定义一个基类型为整型的指针变量p

p=&a[0];  //将元素a[0]的地址赋给指针变量p,使p指向a[0]

在C++中,数组名代表数组中第一个元素(即序号为0的元素)的地址。因此,下面两个语句等价:

p=&a[0];

p=a;

在定义指针变量时可以给它赋初值:

int *p=&a[0];  //p的初值为a[0]的地址

也可以写成

int *p=a;  //作用与前一行相同

可以通过指针引用数组元素。假设p已定义为一个基类型为整型的指针变量,并已将一个整型数组元素的地址赋给了它,使它指向某一个数组元素。如果有以下赋值语句:

*p=1;  //对p当前所指向的数组元素赋予数值1

如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素。

如果p的初值为&a[0],则:

1) p+i和a+i就是a[i]的地址,或者说,它们指向a数组的第i个元素,见图6.12。

ab694503c4d44366efee5d7039b9929f.png

图6.12

2) *(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i]。

可以看出,[]实际上是变址运算符。对a[i]的求解过程是: 先按a+i×d计算数组元素的地址,然后找出此地址所指向的单元中的值。

3) 指向数组元素的指针变量也可以带下标,如p[i]与*(p+i)等价。

根据以上叙述,引用一个数组元素,可用以下方法:

下标法,如a[i]形式;

指针法,如*(a+i)或*(p+i)。其中a是数组名,p是指向数组元素的指针变量。如果已使p的值为a,则*(p+i)就是a[i]。可以通过指向数组元素的指针找到所需的元素。使用指针法能使目标程序质量高。

【例6.5】输出数组中的全部元素。假设有一个整型数组a,有10个元素。要输出各元素的值有3种方法:

1) 下标法。

#include

using namespace std;

int main( )

{

int a[10];

int i;

for(i=0;i<10;i++)

cin>>a[i]; //引用数组元素a[i]

cout<

for(i=0;i<10;i++)

cout<

cout<

return 0;

}

运行情况如下:

9 8 7 6 5 4 3 2 1 0↙            (输入10个元素的值)

9 8 7 6 5 4 3 2 1 0              (输出10个元素的值)

2) 指针法。

将上面程序第7行和第10行的“a[i]”改为“*(a+i)”,运行情况与(1)相同。

3) 用指针变量指向数组元素。

#include

using namespace std;

int main( )

{

int a[10];

int i,*p=a; //指针变量p指向数组a的首元素a[0]

for(i=0;i<10;i++)

cin>>*(p+i); //输入a[0]~a[9]共10个元素

cout<

for(p=a;p

cout<

cout<

return 0;

}

运行情况与前相同。请仔细分析p值的变化和*p的值。

对3种方法的比较:

方法(1)和(2)的执行效率是相同的。第(3)种方法比方法(1)、(2)快。这种方法能提高执行效率。

用下标法比较直观,能直接知道是第几个元素。用地址法或指针变量的方法都不太直观,难以很快地判断出当前处理的是哪一个元素。在用指针变量指向数组元素时要注意: 指针变量p可以指向有效的数组元素,实际上也可以指向数组以后的内存单元。如果有

int a[10], *p=a;    //指针变量p的初值为&a[0]

cout<

在使用指针变量指向数组元素时,应切实保证指向数组中有效的元素。

指向数组元素的指针的运算比较灵活,务必小心谨慎。下面举几个例子。

如果先使p指向数组a的首元素(即p=a),则:

1) p++(或p+=1)。使p指向下一元素,即a[1]。如果用*p,得到下一个元素a[1]的值。

2) *p++。由于++和*同优先级,结合方向为自右而左,因此它等价于*(p++)。作用是: 先得到p指向的变量的值(即*p),然后再使p的值加1。例6.5(3)程序中最后一个for语句:

for(p=a;p

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值