关于const,char *方面的探讨

我们先来看一个程序

#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";

猜你喜欢

转载自blog.csdn.net/qq_34759481/article/details/81869824