• 为什么不能够 向接受 const char ** 参数的函数,传入 char ** 参数?


    /*
    为什么不能够 向接受 const char ** 参数的函数,传入 char ** 参数?

    网上找来的解答是:
    可以向接受 const T 的指针的地方传入 T 的指针(任何类型 T 都适用)。
    但是, 这个允许在带修饰的指针类型上轻微不匹配的规则(明显的例外) 却不能递归应用,
    而只能用于最上层。

    我自己这样理解:(没有研究过编译器,就是瞎猜的。)
    1.
    const char** ccp_ptr;
    <=>
    typedef const char * CCP;
    CCP * CCP_ptr;
    2.
    char** cp_ptr;
    <=>
    typedef char* CP;
    CP * CP_ptr;
    3.
    const CP * cCP_ptr;
    4. test:
    cCP_ptr = CP_ptr; // 这个毫无疑问OK
    cCP_ptr = cp_ptr; // 这个也OK!!!
    CCP_ptr = cp_ptr; // error

    可以看出,CCP 和 const CP 并不可以等价, 编译器没法转换。

    详细的可以研究下面的代码。
    */
    #include <stdio.h>
    #include <string.h>
    #include <time.h>

    typedef char* CP;
    typedef const char * CCP;

    int main( void )
    {
    char c;
    char * char_ptr = &c;
    char ** char_ptr_ptr = &char_ptr;
    const char * const_char_ptr = "abc";
    const char ** const_char_ptr_ptr = &const_char_ptr;
    CP * CP_ptr = char_ptr_ptr; // ok
    CCP * CCP_ptr = const_char_ptr_ptr; // ok
    const CP * const_CP_ptr = CP_ptr; //ok

    const_char_ptr = char_ptr; //ok
    //const_char_ptr_ptr = &char_ptr; //error C2440: '=' : cannot convert from 'char **__w64 ' to 'const char **'
    //char_ptr_ptr = &const_char_ptr; //cannot convert from 'const char **__w64 ' to 'char **'
    CP_ptr = &char_ptr; // OK
    const_CP_ptr = char_ptr_ptr; // OK
    const_CP_ptr = &char_ptr; // OK

    CCP_ptr = &const_char_ptr; //OK
    //CCP_ptr = CP_ptr; //error C2440: '=' : cannot convert from 'CP *' to 'CCP *'
    //CCP_ptr = char_ptr_ptr; //error C2440: '=' : cannot convert from 'char **' to 'CCP *'
    //CCP_ptr = &char_ptr; //error C2440: '=' : cannot convert from 'char **__w64 ' to 'CCP *'

    return 0;
    }

    /* 后记:

    有对编译器深入研究的,请不吝赐教!
    */

  • 相关阅读:
    NFS安装配置与客户端的优化参数
    DELL硬件防火墙配置
    华为交换机命令
    lvs + keepalive的安装配置
    IPVS 的管理
    奇葩的404报错
    js 程序出发事件
    jvm 参数
    策略模式代替大量的if else
    采购订单行类型校验规则
  • 原文地址:https://www.cnblogs.com/prajna/p/3411254.html
Copyright © 2020-2023  润新知