我们先来看一个程序
#include <stdio.h>
int main()
{
char * a = NULL;
char * b = "1234";
a = b;
printf("a = %s\n",a);
return 0;
}
这段程序很简单,就是将指针a指向b指向的字符串。
上面这段代码如果是c,可以编译通过。如果是c++,也可以编译通过,但是会提出警告。"不能将字符串常量转化成char *"。
一般我们使用const char * p= "1234";
#include <stdio.h>
int main()
{
char * a = NULL;
char * b = "1234";
a = b;
printf("a = %d\n",a[0]);
a[0] = '2'; //添加
return 0;
}
然后我们添加一行代码,尝试去修改a指向的值,会报段错误。
因为b指向的值"1234"为常量,是不能被修改的,这个常量被放在了代码段,而一般代码段是不能被修改的。
---------------------------------------------------------------------------------------------------------
如果我们定义了一个空指针,我们想将字符串直接赋给这个指针可以采取strcpy函数。
在上面的例子中,直接使用strcpy是不行的,因为a只是一个空指针,没用空间,他只能指向一个另一个地址,却不能指向一片空间。
所以我们先用new为a分配一片空间,然后就可以执行成功了
#include <stdio.h>
#include <cstring>
int main()
{
char * a = NULL;
const char * b = "1234";
a = new char[10];
strcpy(a,b);
printf("a = %s\n",a);
return 0;
}
接下里分析一下string
string是c++中的类,专门处理字符串。
string.c_str()的返回值是const char * 类型,我们必须定义一个const char *类型的变量才能去接受它。
如果我们想用char *去接受也可以,它强制转化成char *类型的,虽然接受它的类型是char *的,但是我们一旦想要去修改它,还是会报错。
所以,在用指针去处理string.c_str()的值不管用什么类型接受它,都只能做右值。
---------------------------------------------------------
可以采用string的方式接收
int main()
{
using std::cout;
using std::endl;
using std::string;
string a = "1234";
string b;
//b = a; //这是一定可以的
b = a.c_str();
cout << a << endl;
cout << b << endl;
return 0;
}
----------------------更新----------------------
const char * const p = "hello";
在表示一个常量时,应该使用const char * const p = "hello";
在c++ 11中使用char * p = "hello";是不允许的,会报警告。最好还是用const string p = "hello";