每个数组元素都在内存中占用存储单元

padding: 0px; overflow-wrap: break-word; clear: both; text-indent: 28px; color: rgb(24, 30, 51); font-family: PingFangSC, 微软雅黑, 黑体, Arial, Helvetica, sans-serif; font-size: 18px; background-color: rgb(255, 255, 255);">一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。所谓数组元素的指针就是数组元素的地址。

padding: 0px; overflow-wrap: break-word; clear: both; text-indent: 28px; color: rgb(24, 30, 51); font-family: PingFangSC, 微软雅黑, 黑体, Arial, Helvetica, sans-serif; font-size: 18px; background-color: rgb(255, 255, 255);">每个数组元素都在内存中占用存储单元

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的初值为&a[0],则:

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

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

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

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

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

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

我们来看这样一个例子。

7-2】假设有一个整型数组a,有10个元素。要输出各元素的值:下标法输出数组中的全部元素。

#include<iostream.h>

int main()

{

int a[10];

int i;

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

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

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

cout<<a[i]<<" ";           //引用数组元素a[i]

return 0;

}

程序运行结果:

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

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


例7-3】指针法输出数组中的全部元素

#include<iostream.h>

int main()

{

int a[10];

int i;

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

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

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

cout<<*(a+i)<<” ”;        //引用数组元素a[i]

return 0;

}


程序运行结果跟【例7-2】相同。

例7-4】用指针变量指向数组元素输出数组中的全部元素

#include<iostream.h>

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个元素

for(p=a;p<(a+10);p++)

cout<<*p<<” ”;                //p先后指向a[0]~a[9]

return 0;

}


运行情况与【例7-2【例7-3相同。对比这3方法

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

2)用下标法比较直观,能直接知道是第几个元素。用地址法或指针变量的方法都不太直观,难以很快地判断出当前处理的是哪一个元素。

在用指针变量指向数组元素时要注意:指针变量p可以指向有效的数组元素,实际上也可以指向数组以后的内存单元。在使用指针变量指向数组元素时,应切实保证指向数组中有效的元素。

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

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

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

2)       *p++。由于++*同优先级,结合方向为自右而左,因此它等价于*(p++)。作用是:先得到p指向的变量的值(*p),然后再使p的值加1

3)       *(p++)*(++p)作用不同。前者是先取*p值,然后使p1。后者是先使p1,再取*p。若p的初值为a(即&a[0]),输出*(p++)得到a[0]的值,而输出*++p)则得到a[1]的值。

(4) (*p)++表示p所指向的元素值加1,即(a[0])++,如果a[0]=3,则(a[0])++的值为4。注意:是元素值1,而不是指针值加1

(5) 如果p当前指向a[i],则

       *(p--)   先对p进行“*”运算,得到a[i],再使p1p指向a[i-1]

       *(++p)  先使p自加1,再作*运算,得到a[i+1]

       *(--p)  先使p自减1,再作*运算,得到a[i-1]

将++和--运算符用于指向数组元素的指针变量十分有效,可以使指针变量自动向前或向后移动,指向下一个或上一个数组元素。但在用*p++形式的运算时,很容易弄错,一定要十分小心,弄清楚先取p值还是先使p加1。


Top