1. 结构体数组
概念
结构体数组是数组,数组中的每个元素都是结构体类型。
定义
c
struct 结构体名 数组名[元素个数];
例如:
c
struct student {
char name[32];
char sex;
int age;
int score;
};
struct student s[3]; // 定义了一个包含3个学生的数组
初始化
c
struct student s[3] = {
{"zhangsan", 'm', 19, 100},
{"lisi", 'f', 18, 90},
{"wanger", 'm', 17, 85}
};
访问
通过下标访问每个结构体元素,再使用.或->访问成员。
示例:打印第一个学生的姓名
c
printf("%s\\n", s[0].name);
练习示例
从终端接收N(N≤5)个学生信息,打印出成绩最低的学生的姓名。
注意:需要封装两个函数:

2. 共用体(联合体)
概念
共用体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。但是,任何时候只能有一个成员带有值。
定义
c
union 共用体名 {
数据类型1 成员变量1;
数据类型2 成员变量2;
…
};
示例
c
union Data {
int i;
float f;
char str[20];
};
内存占用
共用体的大小等于其最大成员的大小。
大小端问题
-
小端:低地址存低字节,高地址存高字节(Intel x86通常是小端)
-
大端:低地址存高字节,高地址存低字节(网络字节序通常是大端)
判断大小端的代码(重要):

3. 枚举
概念
枚举是C语言中的一种基本数据类型,它可以让数据更简洁易读。
定义
c
enum 枚举名 {
枚举常量1,
枚举常量2,
…
};
默认情况下,第一个枚举常量的值为0,后续依次递增。
示例
c
enum weekday {
Monday, // 0
Tuesday, // 1
Wednesday, // 2
Thursday, // 3
Friday, // 4
Saturday, // 5
Sunday // 6
};
可以指定枚举常量的值:
c
enum color {
red = 1,
green = 2,
blue = 4
};
4. typedef关键字
概念
typedef用于为现有的类型创建一个新的名字(类型别名),以简化代码。
示例
为结构体、共用体、枚举定义类型别名:
c
typedef struct student {
char name[32];
char sex;
int age;
int score;
} stu_t;
typedef union Data {
int i;
float f;
char str[20];
} data_un;
typedef enum weekday {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
} weekday_en;
使用别名定义变量:
c
stu_t s1;
data_un d1;
weekday_en today = Monday;
5. 位运算
位运算符
-
&:按位与
-
|:按位或
-
^:按位异或
-
~:按位取反
-
<<:左移
-
>>:右移
应用场景
将某位置1
c
num |= (1 << n); // 将num的第n位置1
将某位置0
c
num &= ~(1 << n); // 将num的第n位置0
交换两个数

6. 内存管理
内存空间分布
C语言程序的内存空间分为以下几个区域:
-
栈区(stack):由编译器自动分配释放,存放局部变量、函数参数等。
-
堆区(heap):由程序员手动分配释放,通过malloc、calloc、realloc和free函数操作。
-
全局/静态存储区:存放全局变量和静态变量(static)。
-
常量区:存放常量字符串等。
-
代码区:存放程序的二进制代码。
图示:

堆区内存管理函数
malloc
c
void *malloc(size_t size);
功能:申请size个字节的堆区空间。 返回值:成功返回申请到的空间首地址,失败返回NULL。
free
c
void free(void *ptr);
功能:释放ptr指向的堆区空间。
示例
c
#include <stdio.h>
#include <stdlib.h>
int main() {
int *p = (int *)malloc(10 * sizeof(int)); // 申请10个整型空间
if (p == NULL) {
printf("内存申请失败\\n");
return -1;
}
for (int i = 0; i < 10; i++) {
p[i] = i;
}
for (int i = 0; i < 10; i++) {
printf("%d ", p[i]);
}
printf("\\n");
free(p); // 释放内存
return 0;
}
栈区与堆区的区别
-
栈区是由操作系统管理,操作系统负责对空间的申请释放,一般用于存放局部变量,执行到变 量定义开辟空间,超过变量作用域,回收变量空间
-
堆区是由程序员手动管理,程序员可以通过malloc申请堆区空间,使用free释放堆区空间 频繁使用的
-
小数据空间一般用栈区
-
大的数据存储空间一般使用堆区
-
栈的增长方向为自高向低增长,堆的增长方向为自低向高增长
练习:
有一个班的4个学生,有5门课程。
struct student { char name[32]; int no; int score[5]; };
1、求第一门课的平均分;
2、找出有两门以上课程不及格的学生,输出他们的学号和全部课程成绩及平均分
3、找出平均分在90分以上或全部课程成绩在85分以上的学生。 分别编写三个函数来实现以上三个要求



网硕互联帮助中心



评论前必须登录!
注册