第四章 数组和指针
1.数组的维数必须用值大于等于1的常量表达式定义,非const常量以及要到运行阶段才知道其值的const变量都不能用于定义数组的维数;
2.注意下面两种初始化的区别:
char c1[] = {'C', '+', '+'}; //末尾没有null,3维
char c2[] = "C++"; //末尾有null,4维;
char c3[3] = "C++"; //error
3.数组下标的正确类型是size_t;
4.指针变量的定义:
int *p1; //风格1
int* p2; //风格2
int *p3, *p4; //good
int* p3, p4; //bad,p3是指针,p4是int类型
int* p3, *p4; //ok,但易出错
建议采用风格:*紧贴指针变量名放置;
5.指针类型void* , 它可以保存任何类型对象的地址;
void*指针只支持几种有限的操作:
与另一个指针进行比较;
向函数传递void*指针或从函数返回void*指针;
给另一个void*指针赋值;
*不允许使用void指针操纵它所指向的对象;
6.指针与引用的比较:
引用总是指向某个对象,需要初始化(即不能为空),而且初始化后无法改变;
给引用赋值修改的是所关联的对象的值,而不是使引用与另一个对象关联;
指针是一个实体,分配内存;引用是一个别名,不分配内存;
7.指针和const:
const double *cptr; //指向const对象的指针;
不能把const对象的地址赋给非const对象的指针;
允许把非const对象的地址赋给指向const对象的指针;
**该指针所指对象的值是不能通过该指针来修改的(这么说是因为,可能该指针指向一个非const对象,该对象可以通过其他途径进行修改);而指针本身是可以修改的;
而对于const指针,指针本身是不可以修改的,故它必须在定义时进行初始化:
int num = 0;
int * const curnum = #
8.指针和typedef:
typedef string *pstring;
const pstring cstr;
以上语句应该等价于:
string * const cstr;
//或者:
typedef string *pstring;
pstring const cstr;
const修饰的是pstring,即cstr是指向string类型的const指针;
9.应用strn函数处理C风格字符串,它们比str函数更安全,因为可以控制字符的个数;
10.动态数组:
size_t n = get_size();
int *p = new int[n];
for (int *q = p; q != p+n; ++q)
……
delete [] p;
11.混合使用string和C风格字符串:
string st("Hello");
char *str = st.c_str(); //almost ok,but not quite
char *str = st; //error
const char * str = st.c_str(); //ok
12.typedef简化指向多维数组的指针:
int ia[3][4];
typedef int int_array[4];
int_array *ip = ia;
int_array是一个指向int[4]的指针;