1.结构体(2):
(1)结构体类型定义
(2)结构体变量的定义
(3)结构体元素的访问
(4)结构体的存储:
内存对齐:
char 按照1字节对齐
short 按照2字节对齐
int 按照4字节对齐
double 按照4字节对齐
结构体整体的大小必须为最大基本类型长度的整数倍
(5)结构体作为函数参数
练习:定义一个学生的类型,封装一个函数GetStuInfo获得学生信息放入结构体中,
再封装一个函数PutStuInfo打印学生信息
#include <stdio.h>
struct student
{
char name[32];
char sex;
int age;
int score;
};
int GetAllStuInfo(struct student *pstu, int maxlen)
{
int i = 0;
int curlen = 0;
printf("请输入学生个数:\n");
scanf("%d", &curlen);
for (i = 0; i < curlen; i++)
{
scanf("%s", pstu[i].name);
scanf(" %c", &pstu[i].sex);
scanf("%d", &pstu[i].age);
scanf("%d", &pstu[i].score);
}
return curlen;
}
int PutAllStuInfo(struct student *pstu, int len)
{
int i = 0;
for (i = 0; i < len; i++)
{
printf("姓名:%s\n", pstu[i].name);
printf("性别:%c\n", pstu[i].sex);
printf("年龄:%d\n", pstu[i].age);
printf("成绩:%d\n", pstu[i].score);
}
return 0;
}
int main(void)
{
struct student s[100];
int n = 0;
n = GetAllStuInfo(s, 100);
PutAllStuInfo(s, n);
return 0;
}
(6)结构体数组:
struct student s[5];
2.共用体:
union 共用体名
{
数据类型1 成员变量1;
数据类型2 成员变量2;
数据类型3 成员变量3;
...
};
共用体所有成员变量共享同一片空间
#include <stdio.h>
union u
{
char a;
short b;
int c;
};
int main(void)
{
union u u1;
u1.a = 'A';
printf("%c\n", u1.a);
u1.b = 20;
printf("%d\n", u1.b);
u1.c = 50;
printf("%d\n", u1.c);
printf("%d\n", u1.b);
return 0;
}
内存大小端:
1.内存小端:
内存低地址存放低数据位
内存高地址存放高数据位
2.内存大端:
内存低地址存放高数据位
内存高地址存放低数据位
3.枚举:
enum 枚举类型名
{
枚举常量1,
枚举常量2,
枚举常量3,
..
};
注意:
1.枚举类型一般说明将来变量的值在给定的常量中选择其一作为它的值
2.枚举常量的值总是前一个枚举常量的值+1,第一个默认为0值
3.枚举常量默认为int类型,可以直接在程序中使用
#include <stdio.h>
enum weekday
{
Monday = 1,
Tuesday,
Wednesday,
Thurday,
Friday,
Saturday,
Sunday
};
int main(void)
{
enum weekday day;
printf("请输入今天星期几:\n");
scanf("%d", (int *)&day);
switch (day)
{
case Monday:printf("1和6限号!\n");break;
case Tuesday:printf("2和7限号!\n");break;
case Wednesday:printf("3和8限号!\n");break;
case Thurday:printf("4和9限号!\n");break;
case Friday:printf("0和5限号!\n");break;
case Saturday:
case Sunday:printf("不限行!\n");
}
return 0;
}
4.位运算运算符:
& 按位与
| 按位或
^ 按位异或 相同为0 相异为1
~ 按位取反
>> 右移 右移n位 等价于 让该数 / 2^n
<< 左移 左移n位 等价于 让该数 * 2^n
(1)按位异或实现数据交换:
a = a ^ b;
b = a ^ b;
a = a ^ b;
#include <stdio.h>
int main(void)
{
int a = 100;
int b = 200;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a = %d, b = %d\n", a, b);
return 0;
}
(2)将变量的第n位置0:
num = num & ~(1 << n)
(3)将变量的第n位置1:
num = num | (1 << n)
作业:
有一个班的5个学生,有3门课程。
1、求第一门课的平均分;
2、找出有两门以上课程不及格的学生,输出他们的学号和全部课程成绩及平均分
3、找出平均分在90分以上或全部课程成绩在85分以上的学生。
分别编写三个函数来实现以上三个要求