const char*和char*的转换是老生常谈了,很多人搞不清的原因是“字符串常量”这个东西在搞怪,本人觉得这才是搞清楚问题的关键。
下面是一个简单的测试程序:
编译环境:windows、vs2010
#include<stdio.h>
int main(void)
{
//(1)char *到const char*的转换
char *str = (char*)malloc(sizeof("hello!const pointer"));
strcpy(str,"hello!const pointer");
const char*c_str = str;
//*c_str = 'V';//NO,windows编译不通过;linux编译可通过,但执行到此exit
*str = 'M';//OK
//(2)const char*到char *的转换
char*str_2 = const_cast<char*>(c_str);//linux没有const_cast,做了隐式转换,效果相同
*str_2 = '2';//OK
//(3)最容易混淆的是字符串常量
char *str_3 = "this is const string!";
//*str_3 = 'T';//NO,指针指向静态存储区的字符串常量,不允许修改。和const的效果相同
//需要修改的话拷贝出来,方法比较简单,参照(1)
if(str)
free(str);
}
总结:
(1)这两者的转换本来没什问题,只是在字符串常量会在这里混淆视听。
(2)使用的时候需要分清楚,指针是不是指向的字符串常量。
(3)若const char*p指向不是常量字符串,p只是禁止了修改内容这个行为。
比如一个函数使用const char*接收一段可以修改的内存,const指针自己不可以修改该内存,但是可以用char*指向该const来修改(这时候需要强制类型转换),实质上使用const char*接收传递并不能保证该内存是安全的。所以一定要谨慎对待强制类型转换。
(4)这个东西在C语言里最容易出现。C++里使用string处理,避免开常量字符串这个东东了。