1. 把 int 型变量赋给指针是非法的,尽管此 int 型变量的值可能为 0。但允许把数值 0 或在编译时可获得0 值的 const 量赋给指针。除了使用数值0或在编译时值为 0 的 const 量外,还可以使用C++ 语言从 C 语言中继承下来的预处理器变量 NULL(必须大写;另:预处理器变量不是在 std 命名空间中定义的,因此其名字应为 NULL,而非 std::NULL)。
2. 由于指针的类型用于确定指针所指对象的类型,因此初始化或赋值时必须保证类型匹配。
3. void*表明该指针与一地址值相关,但不清楚存储在此地址上的对象的类型,可以保存任意类型对象的地址。void* 指针只支持几种有限的操作:与另一个指针进行比较;向函数传递 void* 指针或从函数返回 void* 指针;给另一个 void* 指针赋值。不允许使用 void* 指针操纵它所指向的对象。
4. 指针和引用比较:虽然使用引用(reference)和指针都可间接访问另一个值,但它们之间有两个重要区别。第一个区别在于引用总是指向某个对象:定义引用时没有初始化是错误的。第二个重要区别则是赋值行为的差异:给引用赋值修改的是该引用所关联的对象的值,而并不是使引用与另一个对象关联。引用一经初始化,就始终指向同一个特定对象(这就是为什么引用必须在定义时初始化的原因)。
考虑以下两个程序段。第一个程序段将一个指针赋给另一指针:
int ival = 1024, ival2 = 2048;
int *pi = &ival, *pi2 = &ival2;
pi = pi2; // pi now points to ival2
赋值结束后,pi 所指向的 ival 对象值保持不变,赋值操作修改了 pi 指针的值,使其指向另一个不同的对象。现在考虑另一段相似的程序,使用两个引用赋值:
int &ri = ival, &ri2 = ival2;
ri = ri2; // assigns ival2 to ival
这个赋值操作修改了 ri 引用的值 ival 对象,而并非引用本身。赋值后,这两个引用还是分别指向原来关联的对象,此时这两个对象的值相等。
5. 在使用下标访问数组时,实际上是对指向数组元素的指针做下标操作。只要指针指向数组元素,就可以对它进行下标操作:
intia[] = {0,2,4,6,8};
int *p = &ia[2]; // ok: p points to the element indexed by 2
int j = p[1]; // ok: p[1] equivalent to *(p + 1),
int k = p[-2]; // ok:p[-2] is the sameelement as ia[0]
6. 用指针遍历数组:
const size_t arr_sz = 5;
int int_arr[arr_sz] = { 0, 1, 2, 3, 4 };
// pbegin points to first element, pend points just after the last
for (int *pbegin = int_arr, *pend = int_arr + arr_sz;
pbegin != pend; ++pbegin)
cout << *pbegin << ' '; // print the current element
7. 不能使用指向const对象的指针修改基础对象,然而如果该指针指向的是一个非const对象,可用其他方法修改其所指的对象。本质上说,由于没有方法分辨指向const对象的指针所指的对象是否为const,系统会把它所指的所有对象都视为const。
8. 不能保证指向const的指针所指向的对象的值是一定不可修改的,可把指向const的指针理解为“自以为指向const的指针 ”。
9. 指针本身是 const 的事实并没有说明是否能使用该指针修改它所指向对象的值。指针所指对象的值能否修改完全取决于该对象的类型。
10. 引用原文:在typedef(第 2.6 节)中使用指针往往会带来意外的结果。下面是一个几乎所有人刚开始时都会答错的问题。假设给出以下语句:
typedef string *pstring;
const pstring cstr;
请问 cstr 变量是什么类型?简单的回答是const pstring 类型的指针。进一步问:constpstring 指针所表示的真实类型是什么?很多人都认为真正的类型是:
const string *cstr; // wrong interpretation of const pstring cstr
也就是说,const pstring 是一种指针,指向string 类型的const 对象,但这是错误的。
错误的原因在于将typedef 当做文本扩展了。声明const pstring 时,const修饰的是 pstring 的类型,这是一个指针。因此,该声明语句应该是把cstr 定义为指向string 类型对象的const 指针,这个定义等价于:
// cstr is a const pointer to string
string *const cstr; // equivalent to const pstring cstr
11. C风格字符串既不能确切地归结为 C 语言的类型,也不能归结为 C++ 语言的类型,而是以空字符 null 结束的字符数组