1 课堂回顾

作用域与生命周期

 

2 static 局部变量

C语言基础 (11) 结构体 ,共用体 枚举 typedef

C语言基础 (11) 结构体 ,共用体 枚举 typedef

 

 

2 打字游戏

 

3 内存分区代码分析

 

4 结构体基本操作

(复合类型[自定义类型

 

#include <stdio.h>

#include <string.h>

 

// 定义一个结构体类型

// 1struct是关键字

// 2struct Student合起来才是结构体类型

// 3、结构体内部定义的变量不能直接赋值

// 4、结构体只是一个类型,没有定义变量前,是没有分配空间,没有空间,就不能赋值

 

struct Student

{

    int age;

    char name[50];

    int score;

}; // 有分号

 

int main(int argc, char *argv[])

{

    // 定义结构体变量

    // 1、类型名变量名

    struct Student stu; // 别忘了struct关键字

 

    // 1、结构体变量初始化,和数组一样,要使用大括号

    // 2、只有在定义时才能初始化

    struct Student stu2 = {18, "mike", 59};

 

    // 使用结构体成员,不能直接使用,需要借助结构体变量来引用

    struct Student tmp;

 

    // 如果是普通变量,使用. 点运算符

    tmp.age = 18;

    // tmp.name = "mike"; // name成员是数组名,数组名是常量,不能修改

    strcpy(tmp.name, "mike");

    tmp.score = 59;

 

    // 如果是指针变量,使用->

    // 如果是指针,指针有合法指向,才能操作结构体成员

    struct Student *p;

    p = &tmp;

    p->age = 18;

    strcpy(p->name, "mike");

    p->score = 59;

 

    // 任何结构体变量都可用 . ->操作成员

    (&tmp)->age = 18; //操作指针

 

    (*p).age = 18; //操作内存

 

    return 0;

}

 

5 结构体使用画图

 

C语言基础 (11) 结构体 ,共用体 枚举 typedef

 

结构体大小可以简单认为是上面几个相加,但是实际上比他们大,因为有一个结构体对齐的问题

 

*p等价于p[0]

C语言基础 (11) 结构体 ,共用体 枚举 typedef

// .优先级高,所以*p.age 需要写(*p).age

 

06 结构体变量使用补充

C语言基础 (11) 结构体 ,共用体 枚举 typedef

C语言基础 (11) 结构体 ,共用体 枚举 typedef

 

 

07 结构体数组

 

#include <stdio.h>

#include <string.h>

 

struct Student

{

    int age;

    char name[50];

    int score;

};

 

int main()

{

 

    //

 

    struct Student a[5] =

        {

            18, "mike", 59,

            22, "jiang", 66,

            33, "xiaobai", 87,

            29, "lily", 77,

            30, "lucy", 68};

 

    // 求平均分

    int i = 0;

    int n = sizeof(a) / sizeof(a[0]);

    int sum = 0;

 

    for (i = 0; i < n; i++)

    {

        sum += a[i].score;

    }

 

    printf("平均分: %d\n",sum/n);

}

 

int main01(int argc, char *argv[])

{

    struct Student s;

    struct Student a[5]; // 结构体数组

 

    // (a+1) 指针

 

    // 第一种写法:操作元素

    a[0].age = 18;

    strcpy(a[0].name, "mike");

    a[0].score = 50;

 

    // 第二种写法:操作某个元素地址

    (a + 1)->age = 19;

    strcpy((a + 1)->name, "jiang");

    (a + 1)->score = 59;

 

    //第三种写法:操作元素

    (*(a + 2)).age = 18;

    strcpy((*(a + 2)).name, "lily");

    (*(a + 2)).score = 59;

 

    struct Student *p = a;

    p = &a[0];

 

    p[3].age = 21;

    strcpy(p[3].name, "xiaoming");

    p[3].score = 62;

 

    (p + 4)->age = 22;

    strcpy((p + 4)->name, "xiaojiang");

    (p + 4)->score = 88;

 

    int i = 0;

    int n = sizeof(a) / sizeof(a[0]);

    for (i = 0; i < n; i++)

    {

        printf("%d, %s, %d\n", a[i].age, a[i].name, a[i].score);

    }

 

    return 0;

}

 

 

08 结构体嵌套

 

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

 

struct Info

{

    int age;

    char name[50];

};

 

struct Student

{

    struct Info info; //结构体嵌套

    int score;

};

 

int main(int argc, char const *argv[])

{

    struct Student s;

 

    s.info.age = 18;

    strcpy(s.info.name, "mike");

    s.score = 59;

 

    struct Student *p = &s;

    p->info.age = 18;

    strcpy(p->info.name, "mike");

    p->score = 59;

 

    struct Student tmp = {18, "mike", 59};

 

    printf("%d, %s, %d\n", tmp.info.age, tmp.info.name, tmp.score);

 

    return 0;

}

 

9 结构体赋值

C语言基础 (11) 结构体 ,共用体 枚举 typedef

 

10. 思考题

C语言基础 (11) 结构体 ,共用体 枚举 typedef

 

11 结构体值传递和地址传递的区别

 C语言基础 (11) 结构体 ,共用体 枚举 typedef

 

12 指针指向栈区空间

C语言基础 (11) 结构体 ,共用体 枚举 typedef

 

 

13 指针指向堆区空间

C语言基础 (11) 结构体 ,共用体 枚举 typedef

 

C语言基础 (11) 结构体 ,共用体 枚举 typedef

 

 

14 非法使用内存导致的错误说明

15 成员指针指向data区或栈区

指向data区:

C语言基础 (11) 结构体 ,共用体 枚举 typedef

 

指向栈区:

C语言基础 (11) 结构体 ,共用体 枚举 typedef

 

 

16 成员指针指向堆空间

C语言基础 (11) 结构体 ,共用体 枚举 typedef

 

 

17  结构体套一级指针

 

C语言基础 (11) 结构体 ,共用体 枚举 typedef

struct Student

{

    int age;

    char *name;

    int score;

}; // 有分号

 

int main()

{

    struct Student *p;

 

    // 需要给p分配内存

    p = (struct Student *)malloc(sizeof(struct Student));

 

    if (p == NULL)

    {

        printf("分配失败\n");

        return 0;

    }

 

    p->name = (char *)malloc(strlen("mike") + 1);

 

    // 只要指针指向的空间都在堆区

    p->age = 18;

    strcpy(p->name, "mike"); // 报错因为是指针

    p->score = 59;

 

    printf("%d,%s,%d\n", p->age, p->name, p->score);

 

    // 先释放name

    if (p->name != NULL)

    {

        free(p->name);

        p->name = NULL;

    }

 

    // 再释放p

    if( p != NULL)

    {

        free(p);

        p = NULL;

    }

   

 

    // 再释放p

 

    return 0;

}

 

 

// 释放的时候一定先释放蓝色的 再释放p

 

18 结构体和指针使用总结

 

 

19 共用体

 

结构体字节对齐(就业班)

结构体位段(就业班)

 

共用体(也叫联合体):(共用一块内存空间

C语言基础 (11) 结构体 ,共用体 枚举 typedef

 

改了一个成员会影响到其他的成员,因为是共用体(共用一个内存

 

C语言基础 (11) 结构体 ,共用体 枚举 typedef

 

20 枚举的使用

 

 

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

 

// enum是关键字

// 里面的成员是一个标识符,枚举常量

// 第一个成员如果没有赋值,默认为0,下一个成员比上一个多1

// 枚举类型 enum Color

// 成员: 枚举成员,枚举常量

enum Color

{

    pink, //0

    red, //1

    green = 10,

    white, //11

    blue, //12

    yellow // 。。。

};

 

int main()

{

    int flag = 1;

    if (flag == red)

    {

        printf("red\n");

    }

 

    // 枚举变量flag2

    enum Color flag2;

 

    //1、可以使用枚举成员给flag赋值

    flag2 = pink; // 等价于pink = 0

 

    //2、也可以使用常量给flag赋值,不推荐

    flag2 = 3;

 

    return 0;

}

 

21.type def的使用(在数据结构使用较多

C语言基础 (11) 结构体 ,共用体 枚举 typedef

 

 

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

 

struct Test

{

    int a;

};

// 定义一个结构体变量

struct Test obj;

 

// struct Test2类型起一个别名叫Test2

typedef struct Test2

{

    int a;

}Test2;

 

Test2 tmp;

 

int main()

{

    // 1typedef给一个已存在的类型起一个别名

    // 2typedef不能创建新类型

 

    // int起一个别名叫int64

    typedef int int64; // 有分号

 

    int64 a; //int a; // 宏定义发生在预处理

             // typedef是在编译阶段

 

    return 0;

}

 

相关文章: