C++ char数组不能用字符串赋值

(这个问题很基础)

问题描述:

近几日翻书翻到书上的当年记的一段笔记,大意是下面这段代码会报错。已经很久没学C++了不知道错在哪,于是研究了下,编译器报错“表达式必须为可修改的左值”。
#include
using namespace std;
struct S 
{
	 char name[10];
};
int main()
{
	S a;
	a.name = "abc";
	cout << a.name;
}

原因分析:

大意是不能将字符串常量赋值给字符数组(除非是定义时赋值!如char a[10] = “abc”)。同样的,字符数组也不能赋值给字符数组。
因为name作为数组名,是一个指针常量,储存了这个字符数组的起始地址,不可指向其他字符串、字符数组的地址,不然成了内存泄漏。

int a[10];
int b[10];
b = a; //编译错误,表达式必须为可修改的左值,而b不可修改。

解决方案:

解决方法有非常多种:

①使用string替代字符数组。
②使用strcpy函数:

	//s->name = "12"; 
	strcpy(a.name, "abc");

③使用字符指针:

struct S 
{
	const char *name;
};
int main()
{
	S a;
	a.name = "abc";
	cout << a.name;
}

字符指针可以用字符串赋值,因为它储存的是字符串常量的首地址。
但是,此处必须用字符常量指针!因为赋值给name的“abc”是一个字符串,字符串是常量!不加const修饰会存在间址修改常量的风险。

通过这次简单的字符数组复习,暴露出我的大量知识盲区,还要加倍努力学习。

参考资料:
https://blog.csdn.net/u010012590/article/details/45130675
C++ primer plus

你可能感兴趣的:(温故而知新,c++,c语言)