云计算百科
云计算领域专业知识百科平台

C语言构造数据类型(2)以及内存管理

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分以上的学生。 ​ 分别编写三个函数来实现以上三个要求

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » C语言构造数据类型(2)以及内存管理
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!