数组:
(1)静态数组的维数必须是大于等于1的常量表达式;
(2)在定义静态数组时,如果初始化列表列出元素的一部分,那么剩余元素用值初始化(内置类型被初始化为0,类类型用其默认构造函数进行初始化);如果无初始化列表,那么在函数内部定义的数组元素无初始化,在函数外部定义的数组用值初始化。
(3)静态字符数组既可以用花括号括起来的初始化列表进行初始化,还可以用字符串字面值进行赋值初始化,下述两个初始化定义结果是等价的:
char A[]={‘C’,’+’,’+’,’\0’};
char A[]=”C++”;
(4)在创建动态数组时,数组的长度是运行时确定,所以其维数可以是任意表达式,如果数组元素具有类类型,则使用该类的默认构造函数;如果数组元素是内置类型,则无初始化,如下:
string *psa=new string[10] 元素全部为空string
int *pia=new int[10] 元素无定义
也可以在数组长度后面加一对空圆括号,对其元素进行值初始化:
int *pia1= new int[10]() 元素全部为0
string *psa1=new string[10]()与string *psa=new string[10]是等价的。
指针:
(5)用一个类型标识符定义多个指针的时候,每个指针前面都要加“*”,如下:
int *a,*b; a,b都是int型指针;
int *a,b; a是int型指针,b是int类型
(6)指针的初始化和赋值操作可以有四种情况:
1> 0值的常量表达式(0,const常量表 示、NULL);
2>类型匹配的对象地址;
3>另一个对象的下一个地址;
4>同类型 的另一个指针。
(7)指针只能指向同类型的变量,特殊情况:
1>指向const类型的指针可以被初始化为非const类型的地址;
2>基类的指针可以被初始化为派生类对象的地址;
3>void类型指针可以保存任何类型对象的地址;
(8)指针如果指向数组的情况下,也可以用下标操作,例如:
int a[3]={1,2,3};
int *p=a;
那么p[2]=3;
(9)容许计算数组超出末端的指针,可以对该指针进行算术操作,但不能进行解引用操作。
(10)C++不容许创建长度为0的静态数组,但可以动态创建长度为0的数组(malloc,new)
(11)空指针可以确保不指向任何对象或者函数,除非指针指向的对象已经存在,一般情况下不要定义无指向的指针,如果实在要定义就定义个空指针(NULL)。
(12)使用数组时,大部分情况下都转换为指向数组第一个元素的指针,但是例外情况是:数组用作取地址操作符(&)和sizeof操作符时或用数组对数组的引用初始化时,不会转换为指针。