一、数组
1.数组的长度是固定,指的是一旦初始化就不能改变,相比vector是缺陷,但是速度更快;
2.初始化数组时,维数一定要是整型字面值常量、枚举常量或者const对象;如果没有显示初始化,则在函数体外默认初始化,函数体内不自动初始化;如果是类类型,则调用默认构造函数;
3.不允许数组直接复制和赋值,与vector不同;
4.数组下标类型是size_t;
二、指针
1.声明:int *p1;
2.避免使用未初始化的指针,如果要分开定义指针和指向的对象,则将指针初始化为0,表示不指向任何对象;
3.指针和下标:int a[]={0,2,4,6,8}; int *p=&a[2]; 则int j=p[1];//p[1]相当于*(p+1),a[3],6 ,相当于解引用
int k=p[-2];//k相当于0
4.指向const对象的指针:const double *p;p指针可以改变指向,但不能改变指向的对象,因为对象为const,不需要进行初始化。
Const指针:int i=0; int const* p =&i;必须初始化,不能改变指向。
5.在 typedef中使用指针往往会带来意外的结果。下面是一个几乎所有人刚开始时都会答错的问题。假设给出以下语句:
typedef string *pstring;
const pstring cstr;
请问 cstr 变量是什么类型?简单的回答是 const pstring 类型的指针。进一步问:const pstring 指针所表示的真实类型是什么?很多人都认为真正的类型是: const string *cstr; 也就是说,const pstring 是一种指针,指向 string 类型的 const 对象,但这是错误的。错误的原因在于将 typedef 当做文本扩展了。声明 const pstring 时,const 修饰的是 pstring 的类型,这是一个指针。因此,该声明语句应该是把 cstr 定义为指向 string 类型对象的 const 指针,这个定义等价于: string *const cstr。
string s;
typedef string *pstring;
const pstring cstr1 = &s; // written this way the type is obscured
pstring const cstr2 = &s; // all three decreations are the same type
string *const cstr3 = &s; // they're all const pointers to string
【const有向右结合性,优先修饰右边的元素】
三、C风格字符串
1.标准库函数,首先引入头文件 #include<cstring>
strlen(s) ;返回s的长度,不包括字符串结束符null;注意:函数是以Null作为结束符。
对于char风格的:char ca1[]={‘C’,’+’,’-’};这里末尾没有null,最好别用
char ca2[]=”C+-”;系统末尾自动添加Null
2.动态数组:动态分配的数组不必再编译时知道其长度,可以在运行时才确定数组的长度。与数组变量不同,动态数组将一直存在,知道程序显式释放它为止。
C语言中使用一对标准库函数malloc和free在自由存储区中分配存储空间,C++使用new和delete
3.动态数组的定义只需指定类型和数组长度,不必为数组对象命名;
int *pia=new int[10];//返回指向新分配数组的第一个元素的指针。
且动态数组的初始化只能是元素类型的默认值,类类型为默认构造函数,内置类型无初始化。
内置类型可以通过 int *pia =new int[10]();//初始化为0
注意:用New动态创建长度为0的数组是合法的,但如果是数组变量就不行;
4.动态空间的释放: delete [] pia; // []表示是数组而非单个对象
5.const char *str=st2.c_str(); //c_str()返回指针指向C风格字符串的const char类型的数组,并且以null结束符
四、多维数组
1.int ia[3][4]={{0},{4},{8}};只初始化了每行的第一个元素,其他的函数体内默认初始化为0,函数体外没有初始化。
2.多维数组其实就是数组的数组,因此它的指针,应该是指向第一个内层数组的指针。
int ia[3][4];Int (*p)[4]=ia;ip=&ia[2];