const char*、char*及字符串常量的正确使用

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处理,避免开常量字符串这个东东了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值