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\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 结构体赋值

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("分配失败\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 共用体

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

结构体位段(就业班)

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

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

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的使用(在数据结构使用较多

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

}

C语言基础 (11) 结构体 ,共用体 枚举 typedef的更多相关文章

  1. 嵌入式-C语言基础:联合体和共用体的概念

    有时候同一块内存空间存放类型不同,不同类型的变量共享一块空间. 结构体和共用体的区别: (1)结构体元素有各自单独空间,共用体元素共享空间,空间大小由最大类型确定. (2)结构体元素互不影响共用体赋值 ...

  2. Go语言基础之结构体

    Go语言基础之结构体 Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. 类型别名和自定义类型 自定义类型 在G ...

  3. C语言高级-结构,共用体,文件,链表

    C语言结构 标准声明方式 struct student{        int age;        char sex;    }; 这个可以在main函数中定义:  struct student ...

  4. GO学习-(13) Go语言基础之结构体

    Go语言基础之结构体 Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. ...

  5. 5、数组&字符串&结构体&共用体&枚举

    程序中内存从哪里来 三种内存来源:栈(stack).堆(heap).数据区(.date): 栈(stack) 运行自动分配.自动回收,不需要程序员手工干预: 栈内存可以反复使用: 栈反复使用后,程序不 ...

  6. C++结构、共用体、枚举

    一.结构 结构是C++OOP的基石.学习有关结构的知识僵尸我们离C++的核心OOP更近. 结构是用户定义的类型,同一个结构可以存储多种类型数据,这使得将一个事物的不同属性构成一个对象成为了可能.另外C ...

  7. GO语言基础(结构+语法+类型+变量)

    GO语言基础(结构+语法+类型+变量) Go语言结构 Go语言语法 Go语言类型 Go语言变量       Go 语言结构 Go 语言的基础组成有以下几个部分: 包声明 引入包 函数 变量 语句 &a ...

  8. ndk学习之C语言基础复习----结构体、共用体与C++开端

    自己实现sprintf功能: 关于C中的系统函数sprintf在上次[https://www.cnblogs.com/webor2006/p/7545627.html]学习中已经用到过了,这里再来回顾 ...

  9. 瘋子C语言笔记(结构体/共用体/枚举篇)

    (一)结构体类型 1.简介: 例: struct date { int month; int day; int year; }; struct student { int num; char name ...

随机推荐

  1. mysql备份恢复中的常见错误

        从A主机备份到B主机 mysqldump -uroot  -p vw>vw.sql 现备份数据库文件,需要恢复到目标机B,B的数据库版本为5.5.23,A机器的mysql版本为5.0.2 ...

  2. spring mvc接收http参数

    1.http协议携带参数,无外乎两个三个存储地点:1.url上 ,2.header里 3.body里. 2.get请求是没有body的,数据全都放在url上,以?xx&xxx形式.注:get请 ...

  3. Java中的事务

    Java中的事务 学习了:https://www.cnblogs.com/chengpeng15/p/5802930.html 膜拜一下 org 分为三类:jdbc事务.jta事务.容器事务:

  4. Openstack针对nova,cinder,glance使用ceph的虚拟机创建机制优化

     今天在开源中国社区看到有例如以下一个问题: 已经成功把ceph作为cinder和 glance的后端,可是假设作为nova的后端,虚拟机启动速度非常慢,网上查了一下是由于openstack创建虚 ...

  5. 黑马day07 登录注冊案例(一)

    简单介绍:依据三层架构的思想设计本案例. 1.搭建好开发环境 准备好须要的包和模拟数据库配置文件users.xml -->cn.itheima.dao -->cn.itheima.serv ...

  6. python TypeError: &#39;builtin_function_or_method&#39; object is not iterable keys

    statinfo = os.stat( OneFilePath ) if AllFiles.has_key( statinfo.st_size ): OneKey = AllFiles[ statin ...

  7. Linux命令(九)——系统监视和进程控制

    与windows系统一样,linux系统中也有很多进程在同时运行,每个进程都有一个识别码PID,它是进程的唯一识别标志. 一.进程的类型 1.系统进程 在操作系统启动后,系统环境平台运行所加载的进程, ...

  8. pod install fatal: unable to access 'https://chromium.googlesource.com/webm/libwebp/'

    1. 前往文件夹 /用户/aki/.cocoapods/repos/master/1/9/2/libwebp 2.编辑libwebp.podspec.json 将source git 改为 https ...

  9. BZOJ 2794 DP

    思路: 考虑把询问离线 按照m排序 物品按照a排序 f[i]表示c[j]的和到i b的最大值 背包就好 O(nk)竟然能过-- //By SiriusRen #include <cstdio&g ...

  10. Android之Action Bar

    Action Bar在实际应用中,很好地为用户提供了导航,窗口位置标识,操作点击等功能.它出现于Android3.0(API 11)之后的版本中,在2.1之后的版本中也可以使用. 添加与隐藏Actio ...