C语言基础 (11) 结构体 ,共用体 枚举 typedef
1 课堂回顾
作用域与生命周期
2 static 局部变量
2 打字游戏
3 内存分区代码分析
4 结构体基本操作
(复合类型[自定义类型
#include <stdio.h>
#include <string.h>
// 定义一个结构体类型
// 1、struct是关键字
// 2、struct 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()
{
// 1、typedef给一个已存在的类型起一个别名
// 2、typedef不能创建新类型
// 给int起一个别名叫int64
typedef int int64; // 有分号
int64 a; //int a; // 宏定义发生在预处理
// typedef是在编译阶段
return 0;
}
C语言基础 (11) 结构体 ,共用体 枚举 typedef的更多相关文章
- 嵌入式-C语言基础:联合体和共用体的概念
有时候同一块内存空间存放类型不同,不同类型的变量共享一块空间. 结构体和共用体的区别: (1)结构体元素有各自单独空间,共用体元素共享空间,空间大小由最大类型确定. (2)结构体元素互不影响共用体赋值 ...
- Go语言基础之结构体
Go语言基础之结构体 Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. 类型别名和自定义类型 自定义类型 在G ...
- C语言高级-结构,共用体,文件,链表
C语言结构 标准声明方式 struct student{ int age; char sex; }; 这个可以在main函数中定义: struct student ...
- GO学习-(13) Go语言基础之结构体
Go语言基础之结构体 Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. ...
- 5、数组&字符串&结构体&共用体&枚举
程序中内存从哪里来 三种内存来源:栈(stack).堆(heap).数据区(.date): 栈(stack) 运行自动分配.自动回收,不需要程序员手工干预: 栈内存可以反复使用: 栈反复使用后,程序不 ...
- C++结构、共用体、枚举
一.结构 结构是C++OOP的基石.学习有关结构的知识僵尸我们离C++的核心OOP更近. 结构是用户定义的类型,同一个结构可以存储多种类型数据,这使得将一个事物的不同属性构成一个对象成为了可能.另外C ...
- GO语言基础(结构+语法+类型+变量)
GO语言基础(结构+语法+类型+变量) Go语言结构 Go语言语法 Go语言类型 Go语言变量 Go 语言结构 Go 语言的基础组成有以下几个部分: 包声明 引入包 函数 变量 语句 &a ...
- ndk学习之C语言基础复习----结构体、共用体与C++开端
自己实现sprintf功能: 关于C中的系统函数sprintf在上次[https://www.cnblogs.com/webor2006/p/7545627.html]学习中已经用到过了,这里再来回顾 ...
- 瘋子C语言笔记(结构体/共用体/枚举篇)
(一)结构体类型 1.简介: 例: struct date { int month; int day; int year; }; struct student { int num; char name ...
随机推荐
- jvm学习-垃圾回收算法(三)
垃圾回收算法 引用计数法 比较古老的一种垃圾回收算法.在java的GC并没有采用 增加一个引用 引用+1 减少一个引用引用减一 每次清除引用为0的的对象 缺点:不能回收循环引用的垃圾对象 标记清除 ...
- hdu 4858 容器的简单模拟
我用临接表模拟容器超时 #include<stdio.h> #include<string.h> #include<vector> using namespace ...
- Linux查看文件内容命令:more(转)
Linux more命令类似cat ,不过会以一页一页的形式显示,更方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按b键就会往回(back)一页显示,而且还有搜寻字串的功 ...
- android小技巧:在activity中实现与绑定的fragment的回调
看到标题你可能会想是一个多么高大上的技巧呢?事实上非常一般就是自己定义回调函数. 首先我们知道activity之间的数据传递有几种方式: 一是startActivityForResut()启动一个ac ...
- 简陋版:基于python的自动化测试框架开发
项目背景: XXXX银行项目采用的是B/S架构,主要是为了解决银行业务中的柜员.凭证.现金.账务等来自存款.贷款.会计模块的管理. 手工弊端: 1.项目业务复杂度高,回归测试工作量大2.单个接口功能比 ...
- 【cl】字符串
使用单引号(') 你可以用单引号指示字符串,就如同‘How are you’这样.所有的空白,即空格跟制表符都照原样保留 使用双引号(“) 在双引号中的字符串与单引号中的字符串的使用完全相同,例如“W ...
- DDos攻击,使用深度学习中 栈式自编码的算法
转自:http://www.airghc.top/2016/11/10/Dection-DDos/ 最近研究了一篇论文,关于检测DDos攻击,使用了深度学习中 栈式自编码的算法,现在简要介绍一下内容论 ...
- (hdoj 5137 floyd)How Many Maos Does the Guanxi Worth
How Many Maos Does the Guanxi Worth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 512000/5 ...
- [POJ 3345] Bribing FIPA
[题目链接] http://poj.org/problem?id=3345 [算法] 树形背包 [代码] #include <algorithm> #include <bitset& ...
- shp系列(六)——利用C++进行Dbf文件的写(创建)
上一篇介绍了shp文件的创建,接下来介绍dbf的创建. 推荐结合读取dbf的博客一起看! 推荐结合读取dbf的博客一起看! 推荐结合读取dbf的博客一起看! 1.Dbf头文件的创建 Dbf头文件的结构 ...