在C++语言中,指针和数组由非常紧密的联系,就如即将介绍的,使用数组的时候,编译器一般会将其转换成指针。
通常情况下,使用取地址符来获取指向某个对象的指针,取地址符可以用于任何对象。数组的元素也是对象,对数组使用下标运算符得到该数组指定位置的元素。因此像其他对象一样,对数组的元素使用取地址符就能得到指向该元素的指针:
string nums[]={"one","two","three"}; //数组的元素是string对象
string *p=&nums[0]; //p指向nums的第一个元素
然而,数组还有一个特性:在很多使用到数组名字的地方,编译器都会自动地将其替换为一个指向数组首元素的指针: ?
string *p2=nums; //等价于p2=&nums[0]
由上可知,在某些情况下,数组的操作实际上是指针的操作,这一结论有很多隐藏的意思,其中一层意思是当使用数组作为一个auto型变量的初始值时,推断得到的类型是指针而非数组: ?
int ia[]={0,1,2,3,4,5,6,7,8,9}; //ia是一个含有10个元素的数组
auto ia2(ia); //ia2是一个整型指针,指向ia的第一个元素
ia2=ia; //错误:ia2是一个指针,不能用int型变量赋给指针
? ?指针也是迭代器? ? ? ? ? ? ?
vector和string迭代器支持的运算,数组的指针全部支持。例如:允许使用递增运算符将指向数组元素的指针向前移动到下一个位置上:
int arr[]={0,1,2,3,4,5,6,7,8,9};
int *p=arr; //p指向arr的第一个元素
++p; //p指向arr[1]
也可以实现输出arr的全部元素:
int *e=&arr[10]; //指向arr尾的下一个位置的指针
for(int *b=arr;b!=e;++b)
cout<<*b<<endl; //输出arr的元素
|