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

1 课堂回顾

作用域与生命周期

2 static 局部变量

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 结构体使用画图

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

*p等价于p[0]

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

06 结构体变量使用补充

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 ",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 ", 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 ", tmp.info.age, tmp.info.name, tmp.score);

 

    return 0;

}

 

9 结构体赋值

10. 思考题

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

 

12 指针指向栈区空间

13 指针指向堆区空间

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

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

指向data区:

指向栈区:

16 成员指针指向堆空间

17  结构体套一级指针

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("分配失败 ");

        return 0;

    }

 

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

 

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

    p->age = 18;

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

    p->score = 59;

 

    printf("%d,%s,%d ", 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 共用体

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

结构体位段(就业班)

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

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

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 ");

    }

 

    // 枚举变量flag2

    enum Color flag2;

 

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

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

 

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

    flag2 = 3;

 

    return 0;

}

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

#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;

}

原文地址:https://www.cnblogs.com/eret9616/p/10223067.html