参考文章:c语言中,为什么字符串可以赋值给字符指针变量
1.可以将字符串赋值给指向字符的指针p,而不能将字符串赋值给一个字符数组。
char a[10]="hello";//正确的。
char a[10];a="hello";//错误的
char *a ="hello";//正确的
第一种写法:即char a[10],开辟了10个字节大小的空间,这里的字符串“hello”已经不是常量了,类似于a[0]=‘h’,a[1]=‘e’,a[2]=‘l’,a[3]=‘l’,a[4]=‘o’,a[5]=’\0’;它被存放在栈区。
第二种写法:a=“hello”,则是错误的;因为数组的地址a为一个常量,”hello”其实代表的是存储这些字符的地址,(位于常量区),而非代表字符本身。
如下所示:会报错:因为运算符的左边应该是一个“左值”。所谓“左值”就是指在程序中占用内存空间、可以被修改的量,比如各种变量。 而数组的地址:是一个确定的值。
第三种写法:”hello”位于常量区,即为常量字符串,”hello”是其实代表的是h首元素的地址;因为hello为常量字符串,更好的写法是: const char *a=“hello”;
struct PepInf
{
int age;
char name[10];
char gender[10];
};
void InitPeo(struct PepInf *pc)
{
pc->age = 20;
pc->name = "tianxin";//报错! 1 IntelliSense: 表达式必须是可修改的左值。
pc->gender = "women";
}
c语言中赋值应该采取strcpy的方式,这里就不会出问题啦!
strcpy(pc->name, "tianxin");
strcpy(pc->gender, "女");