(17)指针和数组

来源:互联网 发布:淘宝黑搜任务怎么做 编辑:程序博客网 时间:2024/06/02 06:47
在C++语言中,指针和数组有非常紧密的联系,使用数组的时候编译器一般会把它转换成指针。对数组的元素使用取地址符就能得到指向该元素的指针。
数组有一个特性:在多数用到数组名字的地方,编译器都会自动的将其替换为一个指向数组首元素的指针。

当使用数组作为一个auto变量的初始值时,推断得到的类型是指针而非数组。
当使用decltype关键字时上述转换不会发生,decltype返回的类型仍然是数组。

指针也是迭代器:
迭代器支持的操作,数组的指针全部都支持。如何像迭代器一样遍历元素呢?
一通过数组名或者数组首元素的地址得到指向首元素的指针
二通过下标获取数组中尾元素下一位置的地址

如:

int arr[10]={0,1,2,3,4,5,6,7,8,9};int *p=arr;//获取首元素指针int *e=&arr[10];//尾元素下一位置的指针for(int *b=p;b!=e;++b){cout<<*b<<endl;//输出arr元素}
同样尾后指针不能执行解引用或者递增操作。

标准库函数begin和end:
这两个函数与迭代器的两个重名成员功能类似,但是它们的正确使用形式是将数组作为它的参数

int a [] ={1,2,3,4,5,6};int *pb=begin(a);int *pe=end(a);
begin函数返回的是指向数组首元素的指针,end函数返回的是指向数组尾元素下一位置的指针,这两个函数定义在iterator头文件中。

解引用、递增、比较、与整数相加、两个指针相减等,用在指针和用在迭代器上意义完全一样。给一个指针加上(减去)某整数值,其结果仍是指针。新指针的指针相比之前前进(后退)了该整数值个位置。
两指针相减的结果是它们之间的距离。结果类型是一种名为ptrdiff_t的标准库类型,和size_t一样,ptrdiff_t也是一种定义在
cstddef头文件中的机器相关类型,但是ptrdiff_t是一种带符号类型。

解引用和指针交互使用:

int b[] = {1,2,3,4,5,6};int *p = b;int i= *(p+2);//i的值为b[2]的值


而且只要指针指向数组的元素都可以执行下标操作,如:

int *pt = &b[2];int j = ptr[1];//等价于*(ptr+1),就是b[3]表示的那个元素int k = ptr[-1]//等价于*(ptr-1),就是b[1]表示的那个元素



0 0