zoukankan      html  css  js  c++  java
  • 为什么不能够 向接受 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;
    }

    /* 后记:

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

  • 相关阅读:
    配置hive的元数据到Mysql中
    对部分spi控制的外设芯片需要断电再上电处理
    驱动芯片L9945的odd parity的计算方法
    bit field不具备可移植性
    multiple storage classes in declaration specifiers报错解决
    C编译器中对h文件的重重包含导致的预处理不同的问题
    linker file链接文件
    eclipse编辑器中的TODO和FIXME的使用
    解决hightec的链接文件的路径问题
    LIN开发
  • 原文地址:https://www.cnblogs.com/prajna/p/3411254.html
Copyright © 2011-2022 走看看