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

本文探讨了C语言中向接受constchar**参数的函数传递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;
}

/* 后记:

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

转载于:https://www.cnblogs.com/prajna/p/3411254.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值