万字C语言学习笔记,带你学C带你飞(四)

news/2024/4/24 18:50:31/文章来源:https://blog.csdn.net/qq_44921056/article/details/119141480

文章目录

    • 单链表
    • typedef
        • 1、基础typedef
        • 2、进阶typedef
    • 共用体
    • 枚举类型
        • 1、声明枚举类型
        • 2、定义枚举变量
    • 位域
    • 位操作
    • 文件的写入与写出


  • C语言学习笔记,记录所学,便于复习。 由于篇幅过大,考虑到观感,准备分多篇记录。
  • 学习视频链接:《带你学C带你飞》
  • IDE:Dev-C++ 5.11
  • 为了养成良好的编程习惯,暂时放弃Clion
  • 前排提醒:建议收藏

系列文章链接:
万字C语言学习笔记,带你学C带你飞!(一)
万字C语言学习笔记,带你学C带你飞!(二)


单链表

typedef

使用typedef的目的一盘有两个:

  • 一个是给变量起一个容易记住且意义明确的别名;
  • 一个是简化一些比较复杂的类型声明。

1、基础typedef

typedef是对类型的封装(也就是说,给类型起一个自己喜欢的别名),比起宏定义的直接替换,更灵活一点。

  • 例如,对int应用typedef关键字
# include<stdio.h>typedef int integer;int main()
{integer a;int b;a = 521;b = a;  printf("a = %d\n", a);printf("b = %d\n", b);printf("a所占字节:%d\n", sizeof(a));return 0;
}

输出结果为:

a = 521
b = 521
a所占字节:4

由此可见,typedef只是改变了类型的名称,并没有改变类型的本质。

  • 例:对结构体应用typedef关键字
# include <stdio.h>
# include <stdlib.h>typedef struct Date
{int year;int month;int day;
} DATE;int main()
{struct Date *date;date = (DATE *)malloc(sizeof(DATE));  //如果不用typedef关键字,这里的DATE应该写成struct Date,使用后方便了一些。 if (date == NULL){printf("内存分配失败!\n");exit(1);}date->year = 2021;date->month = 7;date->day = 28;printf("%d-%d-%d\n", date->year, date->month, date->day);return 0;
}

输出:

2021-7-28

2、进阶typedef

简化比较复杂的类型声明

  • 例一:
int (*ptr)[3];
可以改成:
typedef int (*PTR_TO_ARRAY)[3];
  • 例二:
int (*fun)(void);
可以改成:
typedef int (*PTR_TO_FUN)(void);
  • 例三:
int *(*array[3])(int);
其中:
(*array[3])就是一个指针数组
可以认为是:
int *A(int);
可以改成:
typedef int *(*PTR_TO_FUN)(int);
PTR_TO_FUN array[3];

具体应用:

# include <stdio.h>typedef int *(*PTR_TO_FUN)(int);int *funA(int num)
{printf("%d\t", num);return &num;
}int *funB(int num)
{printf("%d\t", num);return &num;
}int *funC(int num)
{printf("%d\t", num);return &num;
}int main()
{PTR_TO_FUN array[3] = {&funA, &funB, &funC};int i;for (i = 0;i < 3;i++){printf("num的地址:%p\n", (array[i])(i));}return 0;
}

输出:

0       num的地址:000000000062FDE0
1       num的地址:000000000062FDE0
2       num的地址:000000000062FDE0

这里编译时会报warring

[Warning] function returns address of local variable [-Wreturn-local-addr]

因为我们这里返回了局部变量的值。

共用体

定义格式:

union 共用体名
{成员列表
};

结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。

共用体在一般的编程中应用较少,在单片机中应用较多。

枚举类型

如果一个变量只有几种可能的值,那么就可以将其定义为枚举类型。

1、声明枚举类型

enum  枚举类型名称  {枚举值名称, 枚举值名称...};

2、定义枚举变量

enum  枚举类型名称 枚举变量1, 枚举变量2;
  • 例1:
# include <stdio.h>
# include <time.h>int main()
{enum Week {sun, mon, tue, wed, thu, fri, sat};enum Week today;struct tm *p;time_t t;time(&t);p = localtime(&t);today = (enum Week) p->tm_wday;  //这里p->tmday返回的是一个整型,要强制转换成枚举类型才能赋值 switch(today){case mon:case tue:case wed:case thu:case fri:printf("上课!\n");break;case sat:case sun:printf("周末!\n");break;default:printf("Error!!!\n"); } return 0;
}

输出:(测试代码时间为2021年7月29日,周四

上课!
  • 例2:
# include <stdio.h>int main()
{enum Color {red, green, blue = 10, yellow};enum Color rgb;printf("red = %d\n", red);printf("green = %d\n", green);printf("blue = %d\n", blue);printf("yellow = %d\n", yellow);return 0;
}

输出:

red = 0
green = 1
blue = 10
yellow = 11

由此看出,默认是从0开始定义的,但我们可以改变默认的值。

位域

  • 使用位域的做法是在结构体定义时,在结构体成员后面使用冒号(:)和数字来表示该成员所占的位数。
  • 位域成员可以没有名称,只要给出数据类型和位宽即可
  • 例:
# include <stdio.h>int main()
{struct Test{unsigned int a:1;unsigned int b:1;unsigned int c:2;  //这里的数值要比你所存放的内容大};struct Test test;test.a = 0;test.b = 1;test.c = 2;printf("a = %d, b = %d, c = %d\n", test.a, test.b, test.c);printf("size of test = %d\n", sizeof(test));return 0;
}

输出:

a = 0, b = 1, c = 2
size of test = 4

位操作

运算符含义优先级举例说明
~按位取反~a如果a为1,~a为0
&按位与a&b只有a和b同时为1,结果才为1;只有a和b其中一个为0,结果为0
^按位异或a^b如果a和b不同,其结果为1;如果a和b相同,其结果为0
l按位或最低a l b只有a和b其中一个为1,结果为1;只有a和b同时为0,结果为0;
  • 和赋值号结合

这四个运算符,除了按位取反只有一个操作数之外,其它三个都可以跟复制好(=)结合到一块,是的代码更简洁。

  • 移位运算符

将某个变量中所有的二进制位进行左移或右移。

  • 左移运算符(<<)

例如: 11001010 << 2在这里插入图片描述

  • 右移运算符(>>)

例如:11001010 >> 2
在这里插入图片描述

左移、右移运算符右边的操作数如果是负数,或者右边的操作数大于左边操作数支持的最大宽度,那么表达式的结果均属于“未定义行为

左边的操作数是有符号还是无符号数,其实也对移位运算符有着不同的影响。无符号数肯定没问题,因为这时候变量里面所有位都用于表示该数值的大小。但如果是有符号数,那就要区别对待了,因为有符号数的左边第一位是符号位,所以如果恰好这个操作数是个负数,那么移位之后是否覆盖符号位的决定权还是落到了编译器身上。

  • 可以和赋值号结合

例如:

a <<= 1;  //a = a << 1;a >>= 1;  //a = a >> 1;

文件的写入与写出

  • 读写单个字符

读取:fgetc和getc
写入:fputc和putc

  • 读写整个字符串

读取:fgets
写入:fputs

  • 二进制读写文件

读取:fread
写入:fwrite

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_72348.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3.x使用Echarts绘制世界地图并进行定点

Vue3.x使用Echarts绘制世界地图并进行定点 一、需求 绘制世界地图并根据返回经纬度数据进行定点将定点数据展示在世界地图内 二、解决 绘制世界地图&#xff0c;利用Echarts图表组件时间&#xff0c;需要世界地图Geojson数据的可以在资源中下载世界地图Geojson数据-Javascr…

2022FALL嵌入式大纲

Jamslade 部分内容有遗漏&#xff0c;可结合 超文本 2022FALL《嵌入式系统原理》期末复习笔记 一起观看 文章目录嵌入式系统片上系统实时系统硬实时系统软实时系统伪指令DMA传输波特率单/半双/全双工通信&#xff1b;对齐/非对齐访问地址译码代码临界区RISCBIOSUARTSPII2CWDTRO…

2.5|shell简介|Linux支持的网络协议|Linux的网络服务

shell简介shell是一种具备特殊功能的程序&#xff0c;它是介于使用者和Unix/Linux操作系统内核间的一个接口。操作计算机需要通过命令&#xff08;command&#xff09;或是程序&#xff08;program&#xff09;&#xff1b;程序需要编译器&#xff08;compiler&#xff09;将程…

东南大学研究生英语18-19秋试卷解析

写在前面 作者&#xff1a;夏日 博客地址&#xff1a;https://blog.csdn.net/zss192 本文为东南大学研究生英语上学期18-19年期末试卷解析&#xff0c;答案来源于 ChatGPT International Conference 单选题 1.A presenter is supposed to do the following in an introdu…

【数据结构趣味多】八大排序

目录 1.直接插入排序 基本思想 代码实现&#xff1a; 直接插入排序的特性总结&#xff1a; 2.希尔排序 基本思想 代码实现 &#xff08;递归实现&#xff09; 希尔排序的特性总结 3.直接选择排序 基本思想 代码实现&#xff1a; 直接选择排序的特性总结 4.堆排序 …

Springboot 全局异常处理类

全局异常处理 在开发过程中&#xff0c;不管是Dao、Servie、Controller,层都有可能发生异常&#xff0c;对于异常处理&#xff0c;通常是try&#xff0d;catch或者直接throw&#xff0c;这会让try&#xff0d;catch的代码在代码中任意出现&#xff0c;系统的代码耦合度高&…

深入Spring底层透析bean生命周期及循环引用的醍醐灌顶篇

目录前言一.Bean的生命周期1.1 Bean的实例化阶段1.2 Bean的初始化阶段&#xff08;重点&#xff09;1.3 Bean的完成阶段二.循环引用问题(面试常问题&#xff09;三.Spring的三级缓存&#xff08;重点来了&#xff09;四.完整的Spring IoC整体总结前言 本篇是接着bean的创建基本…

2023/02/21 事件循环-eventloop 宏任务 微任务 讲解

1 JS是单线程 js是单线程的。也就是说&#xff0c;同一个时间只能做一件事。作为浏览器脚本语言&#xff0c;与它的用途有关。JavaScript的主要用途是和用户互动&#xff0c;以及操作DOM&#xff0c;这决定了它只能是单线程。 js是单线程的。也就是说&#xff0c;同一个时间只…

非常优秀的网站设计案例,设计师必备

厚积才能薄发&#xff0c;一个优秀的设计师的天性一定是想要获得更多网站设计灵感&#xff0c;擅于为新项目寻找创意切入点、搜索设计参考资源、最新的设计趋势。今天为大家带来了一组免费可商用的网站设计案例&#xff0c;通过这些网站设计案例&#xff0c;你可以获得&#xf…

CF707C Pythagorean Triples 题解

CF707C Pythagorean Triples 题解题目链接字面描述题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1样例 #2样例输入 #2样例输出 #2样例 #3样例输入 #3样例输出 #3样例 #4样例输入 #4样例输出 #4样例 #5样例输入 #5样例输出 #5提示思路代码实现题目 链接 http…

华为OD机试 - 最短耗时(C++) | 附带编码思路 【2023】

刷算法题之前必看 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12199283.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 华为OD机试题…

算法笔记(十一)—— 并查集、KMP

并查集 支持集合快速合并 所有数据生成各自的集合&#xff0c;需要提供查询两个两素是不是属于一个集合&#xff0c;和集合合并操作&#xff0c;并查集能够在常数时间级别上对两个操作进行实现 1. 构造结构&#xff08;数据指针&#xff09;&#xff0c;将自己的指针指向自己…

事件流、事件冒泡、阻止冒泡

1、事件流 2、事件冒泡&#xff1a;从小到大 概念&#xff1a; 当一个元素的事件被触发时&#xff0c;同样的事件将会在该元素的所有祖先元素中依次被触发。这一过程被称为事件冒泡 <style> .father{width: 300px;height: 300px;background-color: pink; } .son{width:…

Zookeeper框架

Zookeeper框架概述 1.Zookeeper介绍 Zookeeper&#xff08;以下简称ZK&#xff09;是用来管理和协调其他框架的&#xff0c;很多框架需要依赖ZK&#xff08;例如Hadoop-HA&#xff0c;Kafka&#xff0c;HBase等&#xff09;ZK本身也是一个集群ZK本身也可以存数据(一般保存配置…

koa中间件的实现原理

koa中间件的实现原理如何&#xff1f;先来看一个例子。koa的执行顺序是这样的&#xff1a;const middleware asyncfunction (ctx, next) {console.log(1)await next()console.log(6) }const middleware2 asyncfunction (ctx, next) {console.log(2)await next()console.log(5…

LeetCode 535. TinyURL 的加密与解密

TinyURL 是一种 URL 简化服务&#xff0c; 比如&#xff1a;当你输入一个 URL https://leetcode.com/problems/design-tinyurl 时&#xff0c;它将返回一个简化的URL http://tinyurl.com/4e9iAk 。请你设计一个类来加密与解密 TinyURL 。 加密和解密算法如何设计和运作是没有限…

产品新说 | 指标异常?怎么做能更好配合业务变化(一)

​ 背景&#xff1a; 企业业务运营的平稳&#xff0c;常常要依靠智能运维在后方保驾护航。熟悉运维的肯定都知道&#xff0c;在智能运维中有一环是通过监控指标来判断系统、云、业务应用、网络设备等运行的是否健康&#xff0c;以便及时排障维稳后台。在指标异常检测中&#xf…

读书笔记//来自公众号(2)

非常喜欢阅读同行的文章&#xff0c;彷佛进行一场隔空交流。大家都是数据分析师&#xff0c;有许多共鸣&#xff1b;了解数据分析在不同行业的应用&#xff0c;往往很有收获。 这位朋友在零售行业、工业物联网、汽车互联网、2G电商等做个数据分析&#xff0c;有10多工作经验。…

opencv在windows下环境搭建遇到问题

文章目录debug模式下执行到cv::imshow()报内存异常qt配置opencv环境出现的问题debug模式下执行到cv::imshow()报内存异常 原因是&#xff1a;在添加静态库的时候opencv_world460.lib和opencv_world460d.lib都导入了。 在debug模式下只能导入opencv_world460d.lib动态库&#xf…

OpenGL 渲染管线与显卡可执行程序

渲染管线的六个步骤 OpenGL 渲染管线的六个步骤&#xff0c;从指定几何图元到帧缓冲区写入像素&#xff0c;图像就被 OpenGL 引擎一步步地渲染到屏幕&#xff08;FBO&#xff09;上去了。 指定几何对象 OpenGL 引擎会根据开发者的指令去绘制几何图元。OpenGL&#xff08;ES&…