• 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
  • 相关阅读:
    深兰科技与西班牙BOMAPA集团签订数千万采购订单
    公司大数据智能管理平台密码不正确 Hue平台进不去
    Kafka(二)、Kafka与SpringBoot集成
    Netty网络框架学习笔记-17(客户端断线重连)
    关于css中设置变量用于全局Css或者Js中使用
    李卓豪:网易数帆数据中台逻辑数据湖的实践
    Go语言学习(二) 函数
    javaIO流01:文件,创建文件三种方式,获取文件相关信息,目录操作
    现代卷积神经网络 - 残差网络(ResNet)
    Redis系列:Redis持久化机制与Redis事务
  • 原文地址:https://blog.csdn.net/m0_64407685/article/details/126788115