C++数组(2)--指针和数组

来源:互联网 发布:时间闹钟提醒软件 编辑:程序博客网 时间:2024/06/05 14:14

1.数组标准库函数begin和end
这两个函数与容器中的同名函数相类似,得到数组首指针和尾指针.数组不是类类型,所以不是成员函数.需要注意的是尾指针不能解引用和递增操作.

int a[5] = {1,2,3,4,5};int *beg = begin(a);            //beg指向a首元素的指针int *last = end(a);         //last指向a尾元素下一位置的指针while(beg != last){    cout << *beg << endl;    ++beg;}

2.数组指针运算
1.指向数组的指针可以执行所有迭代器运算,包括自增,自减,比较,解引用,与整数相加,两个指针相减等.
2.一个指针加(减)一个整数,结果任然是指针,新指针指向的元素与原来相比前进(后退)了整数个位置.
3.两个指针指向同一个数组的元素或尾元素下一个位置,就可以进行比价和加减运算,如果两个指针分别指向不相干的对象,则不能比较.指针相减得到一种名为ptrdiff_t的标准库类型.
4.对数组进行运算实际上是对指向数组元素的指针进行下标运算.(标准库下标为无符号,内置下标可以为负数).

int a[5] = {1,2,3,4,5};     //含有5个整数的数组int i = a[2];           //把第3个值赋值给iint *p = a;         //p指向a的首元素i = *(p+2);         //等价于i=a[2]int *q = &a[2];         //q指向索引为2的元素int j = q[1];           //q[1]等价于*(q+1),即a[3]int k = q[-2];          //q[-2]指向a[0]

3.c风格的字符串
C++支持C风格字符串,但是最好不要使用,容易因为内存越界引起程序漏洞.C风格字符串不是一种类型,而是为了表达和使用字符串的一种写法,以空字符结尾,通常用指针操作.
4.c标准库String函数
使用此类函数的字符串必须以空字符结尾,否则函数会一直寻找空字符,出现不可预料的结果.并且c风格字符串很容易造成内存越界,有着严重的安全漏洞.

strlen(p);              //返回p的长度,不计算空字符strcmp(p1,p2);              //比较p1,p2,p1=p2返回0,p1>p2返回正数,p1<p2返回负数strcat(p1,p2);              //将p2附加到p1结尾,返回p1strcpy(p1,p2);              //将p2拷贝给p1,返回p1char ca[] = {'c','+','+'};      //不以空字符结尾cout << strlen(ca) <<endl;      //错误:ca没有以空字符结尾

5.与旧代码的接口
很多C++程序在标准出现以前就写好,肯定没有使用string和vector类型,而且有些程序实际上就是C++和C的接口,也无法使用C++标准库,所以现在C++程序不得不与充满数组和C风格字符串的代码衔接,C++提供了一组功能.
1.混用string对象和C风格字符串
*允许使用以空字符结尾的字符串初始化string对象或为string对象赋值.
*在string加法运算中允许以空字符结尾的字符串作为其中一个对象(不能两个都是).
以上性质不能反过来,所以为string提供一个c_str()的成员函数.

char *str = s;              //错误,不能用string对象赋值char*const char *str = s.c_str();        //正确

2.使用数组初始化vector对象
*不允许使用vertor对象初始化数组,但是允许数组初始化vector对象.

int p[] = {1,2,3,4,5};vector<int> ivec(begin(p),end(p));vector<int> subVec(p+1,p+4); //使用部分数组创建对象,p[1],p[2],p[3]

6.建议
尽量使用标准库类型而非数组,使用指针和数组容易出错,一是指针常用底层操作,容易引起细节错误.二是语法错误,特别是声明时.
现在C++应尽量使用vector和迭代器,避免使用内置数组和指针,尽量使用string类型变量,避免C风格字符串.

原创粉丝点击