• 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类型的指针。例如

    1. int n = 0;
    2. int* p_n = &n;

    p_n是int指针类型, 指向某个int型的对象。

    指针变量的修饰

    指针实际上也是一种变量类型, 只是它保存的内容有些特别, 是指定类型的地址值,通过间接寻址运算符(indirection operator)*, 可以访问到指针指向地址上的指定类型。

    指针也可以用constvolatile修饰。 const intint const均表示一个变量类型是int, 且该变量不能修改。以下两种写法都可以:

    1. const int a = 1;
    2. int const b = 2;

    既然指针是也一种变量类型,同样支持被const修饰, 表示指针的值/指针的指向不允许修改, 指针所指向的那个变量是否允许修改, 那是另外修饰。写法如下:

    1. int a = 1;
    2. int b = 2;
    3. int* const cp_a = &a; // 指针的修饰词,放在*号后面。
    4. *cp_a = 10; // 指针指向的值可以修改
    5. 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或者*)来确定修饰的意图。

    1. int a = 1;
    2. int b = 2;
    3. int* p_a = &a;
    4. *p_a = 10; // 合法
    5. p_a = &b; //合法
    6. const int* cp_a = &a; // const修饰int类型, 并非修饰指针
    7. *cp_a = 11; //报错! const int类型不能修改
    8. cp_a = &b; // 合法, 指针没有const修饰,指针可以修改。
    9. int* const pc_a = &a; // const修饰指针。类型没有const修饰
    10. *pc_a = 12; // 合法, 因为类型没有const修饰,可以修改。
    11. pc_a = &b; //报错! 指针被const修饰, 不能修改指针。
    12. int const* const cpc_a = &a; // int类型被它后面的const修饰, 指针符号*后面也有const修饰
    13. *cpc_a = 13; // 报错! 类型被const修饰,不能修改。
    14. cpc_a = &b; // 报错! 指针被const修饰,不能修改。

     更复杂的指针的指针

    1. int a = 1;
    2. int b = 2;
    3. int* p1 = &a;
    4. int* p2 = &b;
    5. const int* ct_p1 = &a; // ct for const type
    6. const int* ct_p2 = &b; // ct for const type
    7. // int * * pp1; 指向(int*)类型的指针
    8. int** pp1 = &p1;
    9. pp1 = &p2; // 合法,
    10. pp1 = &ct_p1; // 报错! 类型不匹配。 (int*)不能指向(const int*)
    11. // (const int) * * pp1; 指向((const int) *)类型的指针
    12. const int** ct_pp1 = &ct_p1;
    13. ct_pp1 = &ct_p2; // 合法
    14. ct_pp1 = &p1; // 合法!(const int*) 可以指向(int*)类型。
    15. // (const int) (*const)
    16. const int * const ct_cp1 = &a; // 指针也不能修改
    17. const int * const ct_cp2 = &b; // 指针也不能修改
    18. ct_cp1 = &b; // 报错!指针有const修饰
    19. // (const int) (* const) * 指向((const int) (*const))的指针
    20. const
  • 相关阅读:
    资源描述框架的用途及实际应用解析
    KASan介绍
    scrapy框架的保存文件的几种方式
    神经网络建模的建模步骤,人工神经网络建模过程
    首次使用服务器需要注意什么
    【数据结构C/C++】优先(级)队列
    element-ui的el-table属性修改,如内边框,斑马纹,列宽度...
    模拟实现map/set[改编红黑树实现map/set容器底层]
    xxx升学助考网登录参数跟栈分析
    Tomcat:servlet与servlet容器
  • 原文地址:https://blog.csdn.net/m0_64407685/article/details/126788115