// both buf_size and max_files are const const unsigned buf_size = 512, max_files = 20; int staff_size = 27; // nonconst const unsigned sz = get_size(); // const value not known until run time char input_buffer[buf_size]; // ok: const variable string fileTable[max_files + 1]; // ok: constant expression double salaries[staff_size]; // error: non const variable int test_scores[get_size()]; // error: non const expression int vals[sz]; // error: size not known until run time
4.2.1. 什么是指针 指针的概念很简单:指针用于指向对象; 具体来说,指针保存的是另一个对象的地址: string s("hello world"); string *sp = &s; // sp holds the address of s
4.2.2. 指针的定义和初始化 每个指针都有一个与之关联的数据类型,该数据类型决定了指针所指向的对象的类型。 例如,一个 int 型指针只能指向 int 型对象。
1. 指针变量的定义 C++ 语言使用 * 符号把一个标识符声明为指针: vector *pvec; // pvec can point to a vector int *ip1, *ip2; // ip1 and ip2 can point to an int string *pstring; // pstring can point to a string double *dp; // dp can point to a double
4. void* 指针 C++ 提供了一种特殊的指针类型 void*,它可以保存任何类型对象的地址: double obj = 3.14; double *pd = &obj; // ok: void* can hold the address value of any data pointer type void *pv = &obj; // obj can be an object of any type pv = pd; // pd can be a pointer to any type
考虑以下两个程序段。第一个程序段将一个指针赋给另一指针: 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 对象,而并非引用本身。赋值后, 这两个引用还是分别指向原来关联的对象,此时这两个对象的值相等。
允许把非 const 对象的地址赋给指向 const 对象的指针,例如: double dval = 3.14; // dval is a double; its value can be changed cptr = &dval; // ok: but can't change dval through cp
2. const 指针 除指向 const 对象的指针外,C++ 语言还提供了 const 指针——本身的值不能修改: int errNumb = 0; int *const curErr = &errNumb; // curErr is a constant pointer
// pi_ptr is const and points to a const object const double *const pi_ptr = π 本例中,既不能修改 pi_ptr 所指向对象的值,也不允许修改该指针的指向(即 pi_ptr 中存放的地址值)。 可从右向左阅读上述声明语句: “pi_ptr 首先是一个 const 指针,指向 double 类型的 const 对象”。
4. 建议:理解复杂的 const 类型的声明 阅读 const 声明语句产生的部分问题,源于 const 限定符既可以放在类型前也可以放在类型后: string const s1; // s1 and s2 have same type, const string s2; // they're both strings that are const
string s; typedef string *pstring; const pstring cstr1 = &s; // written this way the type is obscured pstring const cstr2 = &s; // all three decreations are the same type string *const cstr3 = &s; // they're all const pointers to string