1) 指针的声明/定义
int* pA, pB, pC; 只有pA是指针,其他两个是int。
如果想这样写,可以用typedef int* IntPointer。
IntPoint pA, pB, pC;
2) void指针的用法
void* 使得类型信息丢了,如果转型出错,会使得程序出错或崩溃。尽量少用。
没有void引用,因为它是无类型的,无法直接访问数据。
void 一般用在函数返回值和函数参数(void指针)上。
3) const 指针
l 指向的内容是const的
以下两者写法皆可:
const int* a;
int const* a;
l 指针本身是const的
int* const a;
l 两者都是const的
以下两种写法皆可:
int const* const a;
const int* const a;
4) const 字符串陷阱
char* p = “hello”; //这时,”hello”是常量,p指针是一个指向常量的指针
所以,严格的写法应该是 const char* p = “hello”。
如果,p[0] = ‘a’;则程序运行崩溃,因为试图去更改常量区,行为是未定义的。
如果想要改变一个数组,需要这样定义:
char p[] = “hello”; //注意 char [] p = “hello”是错误的!
“hello”将保存在全局静态区,而不是常量区,p指向首地址。
5) 引用
l 引用的作用像常量型指针,它是运算符重载的基础
比如,定义两个对象相加
Integer& operator + (Integer& left, Integer& right)
Integer a, b, c;
c = a + b;
如果没有引用,为了提高效率用指针,相当的晦涩且语义也不明确
l 引用声明时必须初始化且只能初始化一次且不能为NULL,这是与指针的一个区别
l const 引用
以下是错误的:
int& a = 1;
因为1是常量,如果可以指向一个常量,那么就可以改变它了。
这样才是对的,const int& a = 1;