struct student
{
char name[20];
char sex;
int age;
} s1;
这句定义了一个结构体变量s1,这个s1不是基本数据类型的变量。它是一个包含三个部分(字符数组、单字符、整型)的复合数据类型。它的第一个组成部分,就是那个 char name[20],又是由基本数据类型char组成的。你不用太纠结,s1就是一个复合体,里面包含了三种类型的数据。使用(比方赋值、输出等)的时候,你得把他拆开来操作。就是是后面那三行了。
2.
第一个问题你若理解开了,那第二个问题你自然就明白了。
你定义了一个数组,该数组元素由一个一个的结构体变量组成。如下:
struct student
{
char name[20];
char sex;
int age;
} s2[10];
那么当你要使用该数组中第5个元素中的sex变量时,是不是得这样使用
printf("%c",s2[4].sex);
scanf("%s",s2[4].name);
用大白话给你说的,不知道这样子你能不能理解。
我能说最佳答案非常坑爹么?
下面我来解释一下他为什么坑爹。
首先C语言是底层语言,既然是底层语言就存在着严谨性,也就是你使用任何内存里面的空间都要说它是装什么的。
比如 int number (number这个变量是用来装整型的)。
比如 char letters(letters这个变量是用来装字符的)。
那么结构体struct student {blablabla……} s1,就可以理解成用来装struct student类型的s1变量。如果你大学老师不是水货的话,那么肯定说过struct student {blablabla……}这段的意思就是定义一个student的类型让它可以像int/char这样的类型使用一样。
所以,一旦你用了struct student {blablabla……} s1定义一个结构体的话,student就是结构类型s1便是结构体变量。
如果是结构体类型(student)的话,我们当然可以这样初始化数据。
struct student s2 = {"wpc",18,"male"};。这句话的潜意思是s2这个地址保存着{blabla……}这样的数据(注:对于楼主的结构体定义我稍微做了下修改,详细参考下图)。
但是你如果用s1 = {"wpc",18,"male"};。对不起,系统会报错,这和你定义s2结构体变量再修改s2 = {"faker",18,"male"}一样会报错。
至于为什么会这样,当你在C语言修改数组、字符串、结构体凡是大于一个内存空间的东西,实际是对该变量赋地址,众所周知s1/s2这样的变量其实保存的数据而不是指针保存的地址。
完。