C++数组指针、函数指针、成员函数指针

操作符名称

  • & 取地址符(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)*, 可以访问到指针指向地址上的指定类型。

指针也可以用constvolatile修饰。 const intint 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

你可能感兴趣的:(c++,开发语言,c语言,程序人生,学习)