今天主要就是一个 关于 C语言变量、数组、结构体等 赋值的一篇文章
问题来源
今天有个同学问了我一个问题?
,
student.name = "abcd"; 为什么是错的?为什么不能赋值?应该怎么赋值?
那么小编我呢,看了半天,终于总结出一篇关于这个问题的 一篇文章。
变量赋值
int main(void){
int a = 0;
a = 1;
char ch = 'a';
ch = 97;
return 0;
}
e:\Workspace\VSCode\test>gcc h.c 可以编译,没有出错。
基本数据类型(int 、double、char等)的变量都可以, 初始化进行赋值和 “再次”
赋值
数组赋值
int main(void){
char str[20] = "abcd";
str = "qwer";
str[0] = '1';
}
常见的赋值我就不写了。
这次编译就出现了错误
e:\Workspace\VSCode\test>gcc h.c
h.c: In function ‘main’:
h.c:5:9: error: assignment to expression with array type
str = “qwer”;
这个是为什么,基本数据类型变量可以,但是数组出错了???
小编先不急说为什么出错,咱们再接着看。
结构体赋值
int main(void){
struct students{
int id;
char name[10];
};
struct students bao = {};
bao.name = "abcd"; //error
或者 char str[20] = ""asdf;
bao.name = str;//这种也是error
当然编译也是出错了。
1、这是网上大神关于 C编译器 的解释。
在初始化字符数组时,编译器会给字符数组首元素赋予初始地址。而后再另外给字符数组赋值字符串,此时字符数组已经具有地址,编译器就会以为是你要给字符数组某个元素赋值。所以说此时是可以给单个字符数组元素赋值单个字符的,但是不可以赋值字符串
2、这个是容易点理解的。
数组名(str)不可以做左值, 因为他是一个常量,你怎么能够把一个地址值赋值给你个常量呢?
大家可以结合两个理解一下。
接下来我就把我处理这个问题的过程代码放在这,供大家理解和参考,(注释都是运行过的)
struct students
{
int id;
char name[10];
};
int main(void){
struct students bao = {};
printf("%d, %s\n", bao.id, bao.name); // 输出是4224528,空(应该是null)
// struct students bao = {3, "123"};可以。第一种赋值方法
// strcpy(bao.name, "bao"); //可以,
// printf("%d, %s\n", bao.id, bao.name);
// bao.name = "bao"; 错误 “stray '\351' in program”其他是乱码,
// bao.name[0] = 'a';
// bao.name[0] = '/0';
// printf("%d, %s\n", bao.id, bao.name);
/* 这样可以,*/
// char arr[10] = "baobao";
// //bao.name = arr; //error "assignment to expression with array type"
// scanf("%s", bao.name); //可以,
// printf("%d, %s\n", bao.id, bao.name);
//所以scanf那一类函数都可以。
// 还有就是memcpy函数 也是可以的
return 0;
}
欢迎关注公众号:

版权声明:本文为weixin_44966900原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。