指针加减运算的特点使得指针特别合适于处理存储在一段连续内存空间中的同类数据。而数组恰好是具有一定顺序关系的若干同类型变量的集合体,数组元素的存储在物理上也是连续的,数组名就是数组存储的首地址。这样,便可以使用指针来对数组及其元素进行方便而快速的操作。例如,下面的语句:
int arr[5];
声明了一个存放5个int类型数的一维数组,数组名arr就是数组的首地址(第一个元素的地址),即arr和&arr[0]相同。数组中5个整数顺序存放,因此通过数组名这个地址常量和简单的算术运算就可以访问数组元素。数组中下标为i的元素就是*(数组名+i),例如,*arr
就是arr[0],*(arr+3)就是数组元素arr[3]。
【注意】把数组作为函数的形参,等价于把指向数组元素的类型的指针作为形参。例如,下面3个写法,出现在形参列表中都是等价的:
void fun(int p[]);
void fun(int p[3]);
void fun(int *p);
【例】设有一个int型数组a,有10个元素。用3种方法输出各元素。
(1)使用数组名和下标
//使用数组名和下标
int main()
{
int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
for (int i = 0; i < 10; i++)
{
cout << a[i]<<" ";
}
cout << endl;
return 0;
}
运行结果:
(2)使用数组名和指针运算
//使用数组名和指针运算
int main()
{
int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
for (int i = 0; i < 10; i++)
{
cout << *(a + i) << " ";
}
cout << endl;
return 0;
}
运行结果:
(3)使用指针变量
//使用指针变量
int main()
{
int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
for (int* p = a; p < (a + 10); p++)
{
cout << *p << " ";
}
cout << endl;
return 0;
}
运行结果: