一、结构体声明、初始化:
方法一:
struct student{
int num;
char name[20];
char sex;
int age;
float score;
char addr[20];
}
; //不要忘记写分号
int num; //在这里定义的num跟结构体中的num没关系,可以正常使用。
struct student s1,s2; //定义结构体变量
scanf("%d%s%d%c%f%s",&s1.num,s1.name,&s1.age,&s1.sex,&s1.score,s1.addr);
//注意:1.输入的时候要把相同类型的分开。如
name和
sex,中间放了个age,如果不放的话,没法区分。这是因为
在name后面要先输入空格,然后再输入M或F。但是%c会直接把
空格当做字符,这样就读不了M了。scanf()会继续往下走,直到
遇
到数字的时候就读数字去了。
2.注意哪些变量需要加“&”,哪些不用。
3.要一个变量一个变量地写,不能直接写:s1.
4.在键盘上输的时候,应该打:1001 "liming"
20M 90.0 "china" ,要
注意在20和
'M'中间不要加空格。
printf("%d %s %c ",s1.num,s1.name,s1.sex); //打印的时候也是要一个一个打印。
s2=s1;
//这种写法是错误的。虽然在VS下面可能能通过。
memcpy(&s2,&s1,sizeof(s1));
//如果想直接赋值,可以用memcpy拷贝。
方法二:
struct student{
int num;
char name[20];
float score;
}s1,s2;
二、结构体对齐:
struct student{
int num;
char name[20];
char sex;
int age;
float score;
char addr[20];
};
如以上结构体:如果用手工计算大小为:4+20+1+4+4+20=53。但是实际上sizeof(struct student)等于56.这就是因为存在对齐的问题。
所以在工作当中想要知道结构体占多少空间,不要自己算。比如malloc的时候,要用sizeof()函数来求一个结构体的大小。
malloc(sizeof(struct student)*10);
网上有很多关于内存对齐的资料,研究太深没有必要,工作中记住两条即可:
1.把小的放在一起。
2.把小的放在最后。
三、结构体嵌套:
struct bir{
int year;
int mon;
int day;
}
struct student{
int num;
char name[20];
char sex;
int age;
float score;
char addr[20];
struct bir birthday;
}s1;
s1.birthday.day=3;
四、结构体数组
struct student{
int num;
char name[20];
char sex;
int age;
float score;
char addr[20];
};
struct student a[5]; //结构体数组
struct student s[2]={{
1001,"liming",20,'M',90.0,"Shenzhen" },{
1002,"xiaohua",21,'F',80.0,"Shanghai" }}; //结构体数组赋初值
int i=0;
while(scanf("%d%s%d%c%f%s",&s[i].num,s[i].name,&s[i].age,&s[i].sex,&s[i].score,s[i].addr)!=EOF){ //经过键盘输入多个
i++;
}
struct student *p;
p=a;
p++; //此时p指向了a[1]
五、结构体指针:
struct student{
int num;
char name[20];
char sex;
int age;
float score;
char addr[20];
}s1;
struct student *p; //结构体指针
p=&s1;
printf("%d",
p->num); /
/访问方式一。
printf("%d",
(*p).num); /
/访问方式二:先解引用,解引用就是结构体。结构体指针指向结构体,解引用是结构体。
a=p->num++; //首先:a=(p->num) ,然后:(p->num)++
a=++p->num; //首先:(p->num)++ , 然后:a=(p->num)
六、结构体指针作为函数参数:
void func(struct student *s1){ //一般不会在形参的位置传递大数据。所以很少在这里传递整个结构体,一方面不能改变外面 的,另一方面数据量太大。一般是传递结构体指针。
}