现代C++程序应尽量使用vector和迭代器类型,而避免使用低级的数组和指针。设计良好的程序只有在强调速度时才在类实现的内部使用数组和指针。
数组:
数组的长度是固定的。
指针:
指针指向单个对象,而迭代器只能用于访问容器内的元素。具体来说指针保存的是另一个对象的地址。
ptrdiff_t n=ip2-ip1;ptrdiff_t也是一种与机器相关的类型。size_t是unsigned类型,ptrdiff_t则是signed整型。
指向const对象的指针:const double *cptr;说明cptr指向的值是const。
int errNumb=0;
int * const cptr=&errNumb;cptr是const,所有需要定义的时候就初始化。
typedef string *pstring;
pstring cstr;则cstr是指向string的指针。
C风格的字符串
C风格的字符串是以空字符null结束的字符数组。'\0'
C++语言通过char *类型的指针来操作C风格的字符串。
#include<cstring> string.h是C语言提供的标准库
提供如下函数 strlen(s)、strcmp(s1,s2)、strcat(s1,s2)、strncpy(s1,s2,n)
尽可能的使用标准库类型string。对于大部分的应用而言,使用标准库类型string。除了增强安全性外,效率也提高了,因此应该尽量避免使用C风格字符串。
创建动态数组
C语言程序使用一对标准库函数malloc和free在自由存储区中分配存储空间,而C++语言则使用new和delete表达式实现相同的功能。对于动态分配的数组,其元素只能初始化为元素类型的默认值,而不能像数组变量那样,用初始列表为数组元素提供各不相同的初值。
int *pia=new int[10]();圆括号要求编译器对数组做值初始化,在本例中即把数组元素都设置为0.
delete[] pia;释放指针所指向的数组空间,在关键字delete和指针之间的空方括号对是必不可少的,它告诉编译器该指针指向的是自由存储区中的数组,而并非单个对象。如果遗漏了空方括号对,这是一个编译器无法发现的错误,将导致程序在运行时出错。多维数组
int ia[3][4];
int (*ip)[4]=ia;--->指向包含4个元素数组的指针。 int *p[4] 是一个指针数组.
ip=&ia[2];
typedef int int_array[4];
int_array *ip=ia;
int ia[2][3]={{0,1,2},{3,4,5}};
int (*p)[3]=ia;
for(p=ia;p!=ia+2;p++)
{
for(int *q=*p;q!=*p+3;q++)
{
cout<<*q<<endl;
}
}
循环输出ia多维数组内的元素。
某些低级任务必须使用指针和数组,但由于使用指针和数组容易出错而且难以调试,应尽量避免使用。一般而言,应该优先使用标准库抽象类而少用语言内置的低级数组和指针。尤其是应该使用string类型取代C风格以空字符串的字符数组。现代C++程序不应使用C风格字符串。