数组
指针
- 通常不要使用string* p; 定义指针,使用string *p;定义。
string* p1, p2; //p1是指针,p2是string类型;
string* p1, *p2; //p1,p2都是指针
“*”只能就近管一个变量。 - 对指针进行初始化或者赋值,只能:
0或者const的0值常量表达式;(0表示未被初始化)
类型匹配的对象的地址;(完全同一类型,int和double指针不能相互赋值) - void* 指针不允许其操纵它所指向的对象,只支持以下操作:
与另一个指针进行比较;
向函数传递void*指针或从函数返回void*指针;
给另一个void*指针赋值; - 指针和const
通常从右向左看,如果变量和const之间没有*,则为const指针,即变量不可变但是指向的内容可以变;若有有*,则为const对象,即指针指向的内容不能改变;
const double *p; // 指向const对象的指针
const *double p; // 指向const对象的指针
double *const p; // const指针
const double *const p; // 指向const对象的const指针
注意:不能把一个const对象赋值给一个普通的、非const对象的指针;但是可以把一个非const对象的地址赋给指向const对象的指针(并且此const对象的指针不能改变指向的内容,但是其他非const对象可以改变内容) - typedef、指针、const
typedef string *pstring;
const pstring cstr; // const指针
pstring const cstr; // const指针
string *const cstr; // const指针
上述三者等价,特别是”const pstring cstr;”, 此句const修饰的是pstring的类型,而pstring是一个指针,因此是一个const指针。 - 指针和引用的区别:
1) 引用总是指向某个对象,因此定义引用时不初始化是错误的;
2) 引用值是别名,给引用赋值之后,就始终指向同一个特定对象,即其地址就不会改变,修改时只能修改其所关联的对象的值。而指针则可以改变其指向对象的值(通过*),也可以让其重新指向一个新的地址。
- 通常不要使用string* p; 定义指针,使用string *p;定义。
int a = 1024, b = 2048;
int *p = &a, *q = &b;
p = q; // 则现在p、q均指向b,但是a、b存储的值不变,a = 1024, b = 2048;
int a = 1024, b = 2048;
int &p = a, &q = b;
p = q; // 则现在p中的值变成了2048,相应a中的值也变为了2048.
C 风格字符串
- 概念:以null结束的字符串;
- 尽量使用标准库string,因为标准库已经负责处理所有的内存管理问题,如字符串大小是否越界等等。尽量不要用c风格字符串;
动态数组(new)
- 数组类型变量的限制:1)数组长度固定不变;2)在编译时必须知道其长度;3)数组只在定义其的块语句内存在。
- delete [] p; //必须有[], 才能释放数组所有元素。如果遗漏,必将导致出错。
多维数组
int *ip[4]; // 指针数组,每个元素均存放地址
int (*ip)[4]; // (*ip)相当于数组的名字,即(*ip)是int[4]类型的,即ip是一个指向含有4个int元素的数组的指针。