08.6.18
4.1第四章 数组和指针
int staff_size = 27;
double salaries[staff_size]; // error: non const variable
在函数体外定义的内置数组,其元素均初始化为 0。
在函数体内定义的内置数组,其元素无初始化。
08.6.23
使用一组字符字面值初始化字符数组时,一定要记得添加结束字符串的空字符。例如,下面的初始化将导致编译时的错误:
const char ch3[6] = "Daniel"; // error: Daniel is 7 elements
08.6.24
string* ps1, ps2; // ps1 is a pointer to string, ps2 is a string
string* ps1, *ps2; // both ps1 and ps2 are pointers to string
很多运行时错误都源于使用了未初始化的指针。
把 int 型变量赋给指针是非法的,尽管此 int 型变量的值可能为 0。但允许把数值 0 或在编译时可获得 0 值的 const 量赋给指针。
void* 表明该指针与一地址值相关,但不清楚存储在此地址上的对象的类型。
void* 指针只支持几种有限的操作:与另一个指针进行比较;向函数传递 void* 指针或从函数返回 void* 指针;给另一个 void* 指针赋值。不允许使用 void* 指针操纵它所指向的对象。
第一个区别在于引用总是指向某个对象:定义引用时没有初始化是错误的。第二个重要区别则是赋值行为的差异:给引用赋值修改的是该引用所关联的对象的值,而并不是使引用与另一个对象关联。引用一经初始化,就始终指向同一个特定对象(这就是为什么引用必须在定义时初始化的原因)。
两个指针减法操作的结果是标准库类型(library type)ptrdiff_t 的数据。
int *p = &ia[2]; // ok: p points to the element indexed by 2
int k = p[-2]; // ok: p[-2] is the same element as ia[0]
不能使用 void* 指针(第 4.2.2 节)保存 const 对象的地址,而必须使用 const void* 类型的指针保存 const 对象的地址:
const int universe = 42;
const void *cpv = &universe; // ok: cpv is const
void *pv = &universe; // error: universe is const
允许把非 const 对象的地址赋给指向 const 对象的指针
const int ic = i ;
int *const cpi = ⁣//wrong
int ic = i ;
int *const cpi = ⁣//right