1、const char * 转换为 char *的2种方法
1、
指向const的指针不能被赋给指向非const的指针,所以应该用strcpy,也就是另开一块内存,把字符一个个复制过去
const char *expr = "goodidea";
char *buf = new char[strlen(expr)+1];
strcpy(buf, expr);
buf[strlen(a)] = '\0';
strcpy
原型:extern char *strcpy(char *dest,char *src);
用法:#include <string.h>
功能:把src所指由NULL结束的字符串复制到dest所指的数组中。
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回:指向dest的指针。
2、
使用const_cast<char*>
const char* tmp = "goodidea";
char* p = const_cast<char*>(tmp);
使用这种方法得到的p仍然不可以改变指向的存储空间的内容。这是因为立即数"goodidea"放在存储常数的内存区域,该区域中的立即数无法更改,若强行访问会发生运行时错误(runtime error)。详见引用4。
在有些情况下,将const char*转化为char*仅仅是某个函数需要一个char*的参数,在这种情况下,可以考虑用这种方法。
虽然指针p可以更改存储区域的内容,但是由于常量存储在常量区,该部分是程序自动分配的,不由程序员指定,该区域的常量无法改变。所以p不可改变内容。
2、string转化为char*
1、使用copy函数
string str="hello";
char p[40];
str.copy(p,5,0); //这里5,代表复制几个字符,0代表复制的位置
*(p+5)='\0'; //要手动加上结束符
cout < <p;
string str="hello";
char p[40];
str.copy(p,5,0); //这里5,代表复制几个字符,0代表复制的位置
*(p+5)='\0'; //要手动加上结束符
cout < <p;
2、可以先将string转换为const char*然后在将const char*转化为char*
3、string转换为const char* 的2种方法
1、data如:
string str="abc";
const char *p=str.data();
2、c_str
如:string str="gdfd";
const char *p=str.c_str();
4、char*转化为const char*
直接赋值。
char *c= new char[5];
c[0] = 'g';
c[1] = 'o';
c[2] = 'o';
c[3] = 'd';
c[4] = '\0';
const char *b = c;
c[0] = 'a';
cout << c;
cout << b;
上面的输出都是aood。
直接赋值的方法,使得指针c和常量指针b同时指向一块存储区域。此时,通过指针c可以改变该存储区域的内容,通过b不可以改变。
由于存储空间是程序员自己通过new指定的,存放在堆中。所以通过c指针可以更改内容,而通过b指针不可更改内容。
5、char*转化为string的方法
直接赋值。
string类自带的拷贝构造函数和“=”号使用了深拷贝。改变sting中的字符不会改变char*中的。
6、const char*转化为string
直接赋值
string类自带的拷贝构造函数和“=”号使用了深拷贝。string中的字符可以改变,而不受const影响。
总结:
1、转化为string的:直接赋值
2、转化为char*的:重新开辟内存,赋值一份
3、转化为const char*的:由char*转,直接赋值;由string转化,使用c_str()或者data()
引用:
1、51CTO博客 阳光如瀑 const char * 转换为 char *
2、新浪博客 notyme的博客 将string转换成char* (转)