&取地址符(Address-Of operator)*间接寻址运算符(Indirection operator).和->成员访问运算符(Member-Access operators),用于取对象的成员。.*和->*指向成员的指针运算符(Pointer-To-Member operators), 用于成员函数指针和成员变量指针的取对象。()函数调用运算符(Function-Call operator)::范围解析运算符(Scope-Resolution operator)
假设类型T, 变量名称name, 指针的定义如下:
T* name;
标识变量名字name, 它是T类型的指针。例如
- int n = 0;
- int* p_n = &n;
p_n是int指针类型, 指向某个int型的对象。
指针实际上也是一种变量类型, 只是它保存的内容有些特别, 是指定类型的地址值,通过间接寻址运算符(indirection operator)*, 可以访问到指针指向地址上的指定类型。
指针也可以用const, volatile修饰。 const int或int const均表示一个变量类型是int, 且该变量不能修改。以下两种写法都可以:
- const int a = 1;
- int const b = 2;
既然指针是也一种变量类型,同样支持被const修饰, 表示指针的值/指针的指向不允许修改, 指针所指向的那个变量是否允许修改, 那是另外修饰。写法如下:
- int a = 1;
- int b = 2;
- int* const cp_a = &a; // 指针的修饰词,放在*号后面。
- *cp_a = 10; // 指针指向的值可以修改
- cp_a = &b; // 指针不能被修改,报错!
总结带修饰的指针的格式:
只要记住修饰词总是放在被修饰的内容后面。
cv表示const / volatile修饰词。指针定义形式如下:
T [cv for T] * [cv for pointer] name
注意对T的修饰放在T的前面也是合法的写法。
const int const c = 2;
在mscv编译器下也不会报错。
完整的格式:[cv for T] T [cv for T] * [cv for pointer] name
| Syntax | meaning |
|---|---|
| const T* | pointer to constant object |
| T const* | pointer to constant object |
| T* const | constant pointer to object |
| const T* const | constant pointer to constant object |
| T const* const | constant pointer to constant object |
上面格式中T还可以是一种指针, 指针的指针仍然是按照修饰词总是修饰前面的标识(T或者*)来确定修饰的意图。
- int a = 1;
- int b = 2;
-
- int* p_a = &a;
- *p_a = 10; // 合法
- p_a = &b; //合法
-
- const int* cp_a = &a; // const修饰int类型, 并非修饰指针
- *cp_a = 11; //报错! const int类型不能修改
- cp_a = &b; // 合法, 指针没有const修饰,指针可以修改。
-
- int* const pc_a = &a; // const修饰指针。类型没有const修饰
- *pc_a = 12; // 合法, 因为类型没有const修饰,可以修改。
- pc_a = &b; //报错! 指针被const修饰, 不能修改指针。
-
- int const* const cpc_a = &a; // int类型被它后面的const修饰, 指针符号*后面也有const修饰
- *cpc_a = 13; // 报错! 类型被const修饰,不能修改。
- cpc_a = &b; // 报错! 指针被const修饰,不能修改。
更复杂的指针的指针
- int a = 1;
- int b = 2;
- int* p1 = &a;
- int* p2 = &b;
- const int* ct_p1 = &a; // ct for const type
- const int* ct_p2 = &b; // ct for const type
-
- // int * * pp1; 指向(int*)类型的指针
- int** pp1 = &p1;
- pp1 = &p2; // 合法,
- pp1 = &ct_p1; // 报错! 类型不匹配。 (int*)不能指向(const int*)
-
- // (const int) * * pp1; 指向((const int) *)类型的指针
- const int** ct_pp1 = &ct_p1;
- ct_pp1 = &ct_p2; // 合法
- ct_pp1 = &p1; // 合法!(const int*) 可以指向(int*)类型。
-
- // (const int) (*const)
- const int * const ct_cp1 = &a; // 指针也不能修改
- const int * const ct_cp2 = &b; // 指针也不能修改
- ct_cp1 = &b; // 报错!指针有const修饰
-
- // (const int) (* const) * 指向((const int) (*const))的指针
- const