四、数组和指针
1. 数组
数组的长度是固定的
在数组维数必须是大于等于1的常量表达式,只能包括整型字面值常量、枚举常量、用常量表达式初始化的整型const对象。
初始化:同内置变量,函数外初始化为0,函数内无初始化。
字符数组:
char ca[] = "c++"; 最后会自动添加'\0',维数为4;
const char ca[3]= "c++"是错误的
数组下标的正确类型是size_t。
2. 指针
避免使用未初始化的指针
将指针初始化为0表明指针不指向任何对象,只能初始化为常量的0或const的变量0,等效于初始化为NULL
void* 指针可以保存任何类型对象的地址。
两个指针的减法操作得到的结果类型是ptrdiff_t,与size_t相似,但是是signed类型
指针和下标:
int ia[] = {1, 2, 3};
int *pb = &ia[2];
int k = pb[-2] //合法,结果是ia的第一个数
从右向左读,* 读作指向
指向const对象的指针:const double * cptr; 不必初始化,因为cptr不为常量,也可指向非常量
cost指针: int *const cur = 0; 因为其本身是一个常量,所以必须在定义时初始化
指向const对象的const指针: const int *const cur = 0;
指针和typedef:
typedef string * pstring;
string * const cstr = NULL;
const pstring cstr = NULL;
pstring const cstr = NULL;三者是一个意思,cstr是一个const指针
3. C风格字符串
以空字符null结束的字符数组
c风格字符串标准库函数: strlen,strcmp,strcat,strcpy,使用这些必须确定字符串以'\0'结尾,否则最后的结果是未知的。
从string转成char*: const char *str = str2.c_str(); // pay attention to the 'const'
4. 动态数组
使用new、delete来进行动态数组的申请,如果数组元素具有类类型,则使用该类的默认构造函数初始化,如果是内置类型,则不进行初始化:可以使用()进行初始化为0
int *pia = new int[10] // not initial
int *pia = new int[10]() // initial
5. 多维数组
int ia[3][4]; // not initial
int (*ip)[4] = ia; // ip 是一个指向四个整数数组的指针 int *ip[4] 表示一个指向整数的指针数组;
ip = &ia[2]; // ia[2] is an array of 4 ints
typedef简化多维数组的指针:
typedef int int_array[4]; int_array *ip = ia;