为什么不能够 向接受 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;
}

/* 后记:

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

posted on 2013-11-06 20:52  mhgu  阅读(541)  评论(0编辑  收藏  举报