C语言 变量、数组、结构体中的赋值


今天主要就是一个 关于 C语言变量、数组、结构体等 赋值的一篇文章

问题来源

  今天有个同学问了我一个问题?    
![定义了一个结构体](https://img-blog.csdnimg.cn/20190516095846653.png),    
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版权协议,转载请附上原文出处链接和本声明。