4.1--------------------数组
4.2--------------------指针的引入
4.3--------------------C风格字符串
4.4--------------------多维数组
4.1数组
数组是由类型名,标示符,维数组成的符合数据类型。类型名指定了放在数组中元素的类型,维数指定了数组的长度。
4.1.1数组的定义和初始化
数组的维数只能是大于等于1的常亮表达式,即:整型字面值,枚举常量,初始化为整型的const对象,注意:非const常量以及要到运行阶段才知道其值的const对象都不能用于定义数组的维数
函数外定义数组,元素为0;
函数内定义数组,元素无初始化;
显式初始化不需要指定数组的维数值,编译器会自动确定。
若元素是类类型,调用默认的构造函数初始化,如果没有默认构造函数,需要显示初始化
测试用例:
classTest
{
};
class Po
{
private:
int p;
int o;
public:
Po(int _p, int _o): p(_p), o(_o){}
};
intmain()
{
Test a[10];
Po b[3];//error
Po b[3] = { Po(1, 1), Po(1, 1), Po(1, 1) };//显式提供初始化
}
如果使用默认的形参,则ok
class Po
{
private:
int p;
int o;
public:
Po(int _p=0, int _o=0): p(_p), o(_o){}
};
intmain()
{
Po b[3];
}
使用字符串字面值初始化字符数组时要记得添加空字符(ascii码为0,'\0',NULL)
如果数组长度小于字面字符串+1,编译器报错;
不允许数组的复制和赋值
与vector不同,数组不能初始化另外一个数组,也不能将数组赋值给另外一个数组
4.1.2数组操作,数组使用下标操作,检查下标是否越界是一个良好的习惯,可以防止缓冲区溢出(Buffer overflow)错误
4.2指针的引入
指针是指向某中类型对象的复合数据类型,用于数组的迭代器:指向数组中的某一个元素。
4.2.1指针的定义与初始化
指针声明语句,是从右向左阅读。注意string *p1,p2;
避免 string* p1;多使用string *p1;这是个建议:将符号紧贴着指针变量名。
指针的三个状态:特定对象的地址(同类型对象地址),某个对象后面另外一个对象,还有0(NULL),在编译时可获得0值的整型const对象或者字面值0;
int zero = 0 ;int *pi = zero;//error
避免使用未赋值的指针,会导致运行是崩溃。
4.2.3指针操作
给指针赋值 vs 通过指针进行赋值
测试用例:
intival1=1024,ival2=2048;
int *pi = &ival,*p2 = &ival2;
pi = pi2;//pi nowpoints to ival2;
指针和引用的比较
int&r1=ival,&r2=ival2;
r1=ival2;//assignival2 to ival
上面比较了指针和引用的区别:引用在定义的时候就需要初始化;引用和指针的赋值行为是有差别的(给引用赋值修改的是引用所关联的对象的值,而不是像指针那样去关联另外一个对象)。
4.2.4使用指针访问数组元素
在表达式中使用数组名时,该名字会自动转换为指向数组第一个元素的指针;这种情况下,指针和数组名可以认为两者相等价
4.2.5指针和const限定符
指向const对象的指针,一般情况下我们可以使用指针来修改对象的值。但是如果指针指向了const对象,C++要求指向const对象的指针必须具有const特性;constdouble *cptr;
*cptr = 21.3;//错误,*cptr might be const
const对象 不能赋给 指向非const对象的指针
非const对象 可以赋给 指向const对象的指针
注解:不能使用指向const对象的指针修改基础对象,然而如果该指针指向了一个非const对象,可以通过指向非const的指针指向这个基础对象,进而用指向非const指针去修改这个对象,只不过没有使用指向const对象的指针修改那个对象罢了。
注意:不能保证指向const的指针所指向的对象的值一定不能被修改,上面注解就是修改对象的值的一个办法
const指针:不能将指针指向其他对象
指向const对象的const指针:不能通过指针修改指针指向的对象,也不能让指针指向其他对象。
typedef 与指针