const char*与char*、unsigned char*相互转换问题

const char*与char*相互转换的问题也是老生常谈的问题了,以前研究过很多次,时间长了还是忘记,在回顾一下。

以前我的记忆是:限制多的不能赋值给限制少的

一、核心结论(C/C++ 硬性规则)

  1. char *const char *可以直接隐式转换,不用强转(安全、放宽只读限制)
  2. const char *char *禁止隐式转换,必须强制类型转换(危险,抛弃只读约束)

1)char* 转 const char*(隐式合法)

原理:把可写指针变成只读指针,不会修改原始数据,编译器允许自动转换。 示例:

char buf[100] = "test"; char *p = buf; // 无需强转,直接赋值 const char *cp = p;

2)const char* 转 char*(必须强转,否则报错 / 警告)

原理:const代表内存只读,强行转成可写指针会破坏常量保护,编译器阻止隐式转换。

const char *cp = "abc"; char *p = cp; // 报错,非法隐式转换 // 正确写法,显式强制转换 char *p = (char *)cp;

二、结合你前面 unsigned char /char 的场景补充

char *unsigned char *双向都不能隐式互转,两边互相赋值、传参都要强制转换,和 const 规则不一样:

unsigned char ubuf[10]; char buf[10]; char *p1 = ubuf; // 警告/报错,类型不匹