【C语言学习】
文章平均质量分 68
C语言学习笔记
听风吹等浪起
佛系学习,适当摆烂…
展开
-
【C语言进阶】关于预处理
目录1. 预定义符号2. 预处理指令3#define3.1 #define定义符号3.2 #difine定义宏3.2.1 #define的替换规则3.2.2 #和##3.2.3 带副作用的宏参数3.2.4 宏和函数的比较3.2.5 #undef 移除一条宏定义4. 条件编译5. 头文件包含5.1 关于头文件重复包含5.2 头文件的打开6. 利用宏,计算结构体成员的偏移地址(offsetof)1. 预定义符号VS:不支持STDC,.原创 2022-05-11 11:44:57 · 485 阅读 · 0 评论 -
【C语言进阶】程序的翻译、执行
目录1. 程序的翻译环境和运行环境2. 程序编译、链接过程3. 翻译环境3.1 编译过程3.1.1 预编译(预处理)3.1.2编译3.1.3汇编3.2链接过程3.2.1 合并段表3.1.2 符号表的合并和重定位4. 运行环境1. 程序的翻译环境和运行环境.c 文件是源文件或者源程序但是在电脑中运行的文件都是 .exe 可执行文件所以 .c的源文件需要经过 编译+链接 变成 .exe可执行文件.c 文本文件------翻译环境--...原创 2022-05-11 08:58:16 · 821 阅读 · 0 评论 -
【C语言进阶】文件操作
目录1. 什么是文件2. 文件名3. 文件类型4. 文件缓冲区5. 文件指针5.1 文件的打开和关闭5.2 文件的顺序读写5.3 文件的随机读取1. 什么是文件只要放到磁盘上的就是文件,C盘、D盘等等。是一种存放信息的一种媒介但是,程序设计中。文件一般分为两种:程序文件、数据文件程序文件:操作数据文件数据文件:被操作的文件2. 文件名一个文件要有一个唯一的文件标识,以便用户的识别和引用文件包含三个部分:文件路径: c:...原创 2022-05-10 11:45:13 · 180 阅读 · 0 评论 -
【C语言进阶】柔性数组
目录1. 柔性数组2. 包括柔性数组成员的结构体类型大小3. 柔性数组开辟空间4. 柔性数组的优势5. 柔性数组的特点1. 柔性数组例如:使用柔性数组:结构体中的最后一个数组如果arr[] 编译不过去,用arr[0] 两种意思是一样的,都是未知大小的数组,柔性数组成员柔性数组:数组的大小是可以调整的2. 包括柔性数组成员的结构体类型大小柔性数组的大小不做计算3. 柔性数组开辟空间相当于开辟:4(结构体大小int n)+5*4原创 2022-05-10 10:26:27 · 271 阅读 · 0 评论 -
【C语言进阶】动态内存分配
目录1. 内存的使用方式2. malloc 和 free 函数2.1 malloc 开辟空间2.2 malloc 开空间失败2.3 free 回收、释放空间3. calloc 函数4. realloc 函数realloc 和 malloc 具有一样的功能5. 常见动态内存分配的错误5.1 直接对NULL空指针解引用5.2 对动态内存空间的越界访问5.3 对非动态开辟内存使用free 释放5.4 使用free 释放动态开辟内存的一部分5.5 对同一块动.原创 2022-05-10 09:43:59 · 200 阅读 · 0 评论 -
【C语言进阶】枚举类型、共用体(联合体)类型
1. 枚举类型1.1 定义枚举类型定义枚举类型:成员是常量枚举自带规定的值:0 1 2 ,int 类型也可以自己赋初值,MALE = 2 之类的,但是以后就不能更改如果部分赋初值的话,下面的会自动递增1,上面的还是0 1 2这样自动取值不能enum Color c = 2; 因为右端是整型,左端是Color枚举类型,不能转换1.2枚举的优点define 定义的标识符常量,不存在类型,只是简单的替换enum 将同一类型封装到一起,防止污染enum 可以调试.原创 2022-05-10 07:56:12 · 415 阅读 · 0 评论 -
【C语言进阶】结构体类型(位段)
目录1. 什么是位段2. 位段的大小2.1 计算 int 位段大小2.2 计算 char 位段大小3. 位段的跨平台问题1. 什么是位段基本上都是相同类型,要么全是int,要么全是char 经过观察,char也可以 但是需要整型家族,char 是 ASCII 码 后面的数字不能大于 32例如:S 就是一个位段2. 位段的大小位段:二进制位、节省内存空间某些数据的值,不会特别大,或者只有几种状态,就用位段节省内存消耗位段开辟空间:.原创 2022-05-10 07:19:39 · 275 阅读 · 0 评论 -
【C语言进阶】结构体类型
目录1. 结构体类型2. 匿名结构体类型3. 结构体的自引用4. 结构体的 typedef5. 结构体类型的初始化6. 结构体的内存对齐7. 内存对齐的原因8. 修改默认对齐数9. offset 取偏移量10. 结构体传参1. 结构体类型内置类型:char、int、short、float自定义类型:结构体类型、枚举类型、联合体类型结构体类型:创建结构体类型:2. 匿名结构体类型省略了结构体标签(名字),那么需要在后面创.原创 2022-05-09 22:41:39 · 4463 阅读 · 1 评论 -
【C语言进阶】内存函数介绍
目录1. 内存函数和字符串函数区别2. 内存拷贝-memcpy3. memmove4. 内存比较-memcmp5. 内存设置-memset1. 内存函数和字符串函数区别字符串操作函数:都是针对字符串、大多数都和 \0 有关但是如果操作的对象是整型数组、结构体或者浮点型数组,字符串操作的函数就起不到作用了例如:拷贝一个整型数组首先,类型不兼容,会报警告 然后,1在内存按小端的存储是:01 00 00 00 因为strcpy操作是char* ,那么一次可以访原创 2022-05-09 17:20:03 · 176 阅读 · 0 评论 -
【C语言进阶】字符串函数介绍
目录1. C语言字符串2. 字符串长度-strlen3. 字符串拷贝-strcpy4. 字符串追加-strcat5. 字符串比较-strcmp6. 长度受限制的字符串函数6.1 strncpy6.2 strncat6.3 strncmp7. 字符串查找-strstr8. 字符串分隔-strtok9. 字符串错误码-strerror10. 其他字符串函数1. C语言字符串2. 字符串长度-strlen返回的是无符号数注意:两...原创 2022-05-09 14:01:35 · 155 阅读 · 0 评论 -
【C语言进阶】练习题
目录1.喝汽水问题1.1 第一种实现1.2 第二种实现2. 整型提升3.打印杨辉三角4. 逻辑判断4.1 谁是凶手4.2 比赛排名1.喝汽水问题1.1 第一种实现问题描述:一瓶汽水一元,2个空瓶可以换一瓶汽水。问题:20元可以喝多少瓶汽水?由于最后还剩一个空瓶子,那也可以先问老板借一瓶汽水然后喝掉,就有两个空瓶子去换刚刚借的那瓶汽水了,答案也可以为:401.2 第二种实现一瓶汽水一元,两个空瓶子换一瓶汽水,所以一个空瓶子0....原创 2022-05-06 14:46:02 · 739 阅读 · 0 评论 -
【C语言进阶】指针进阶(指针和数组练习题)
目录1.一维整型数组2.字符数组2.1 字符数组2.1.1 字符数组-sizeof2.1.2 字符数组-strlen2.2字符串形式2.2.1字符串形式-sizeof2.2.2字符串形式-strlen2.3 常量字符串形式2.3.1 常量字符串形式-sizeof2.3.2 常量字符串形式-strlen3. 二维数组1.一维整型数组* 和 & 同时操作,可以想象成 抵消 所以 ,sizeof(*&a)==sizeof(a)...原创 2022-05-06 00:21:38 · 1032 阅读 · 0 评论 -
【C语言进阶】指针进阶(回调函数、qsort)
0.函数指针1.指向函数指针数组的指针*ppfArr 说明变量 ppfArr 是一个指针 指针 [4] 指向的是一个数组,有4个元素 每个元素类型都是int (*)(int,int) 函数指针类型函数指针数组:转移表2.回调函数 把Add函数传递给pf指针(275行),通过pf去调用所指向的Add函数(259行)。 函数的地址传递给一个指针, 在函数内部通过指针调用函数的时候被调用的函数就是回调函数。通过地址在调用函数...原创 2022-05-05 14:23:30 · 215 阅读 · 0 评论 -
【C语言进阶】指针进阶(函数指针)
目录1.函数指针2.函数类型3. 看几个代码练习代码分析1代码分析24.函数的解引用5.函数指针数组6.练习1.函数指针数组指针:指向数组的指针 函数指针:指向函数的指针(存放函数地址的指针)数组arr:arr是首元素地址,&arr是整个数组地址 函数没有首元素的概念,所以函数名和&函数名都是函数的地址2.函数类型首先看一下数组指针:int arr[10];怎么存储&arr,整个数组的地址呢 首先&a.原创 2022-05-05 10:51:43 · 232 阅读 · 0 评论 -
【C语言进阶】指针进阶(数组传参、指针传参)
目录1.前言2. 一维数组传参3.二维数组传参4.指针传参4.1一级指针传参4.2 二级指针传参1.前言去掉变量名,就是类型 数组指针的类型就是:int (*)[5]2. 一维数组传参第一个int arr[]:对的 第二个int arr[10]:不写都是对的,写上或者写错也没毛病。但是这里的10没用,没必要写 第三个int* arr:数组名是首元素地址,那地址就可以用指针来接收,数组每个元素是int类型的,所以指针用int* 第四个int..原创 2022-05-05 09:34:31 · 4746 阅读 · 3 评论 -
【C语言进阶】指针进阶(指针数组、数组指针)
1.原创 2022-05-03 21:34:42 · 598 阅读 · 0 评论 -
【C语言进阶】数据的存储(浮点型)
目录1.浮点数2.浮点数在内存中的存储3.指数E从内存中取出三种情况4.例题1.浮点数2.浮点数在内存中的存储之前介绍的整型的范围:char、short、int等的范围可以在limits.h头文件中查找 float、double浮点型可以在float.h头文件中查找例如: 9.0 对应的二进制为 1001.0 ,科学计数法为 1.001 * 2 *3 写成上面的形式为:(-1)^s * M * 2^E = (-1)^0 * 1.001 * 2^3...原创 2022-05-03 20:18:58 · 473 阅读 · 0 评论 -
【C语言进阶】数据的存储
目录1.数据类型介绍2.整型在内存中的存储大端小端3.练习练习1练习24. char 类型1.数据类型介绍C语言的数据类型分为两种:1.内置类型:char、int、double2.自定义类型(构造类型):数组、结构体(struct)、枚举(enum)、联合体/共用体(union)决定了开辟空间的大小 如何看待内存空间的视角:同样一串二进制码,int和float看到的是不一样的C语言规定:函数没有形参的时候,调用可以传递实参或者不传,只是.原创 2022-05-02 17:45:02 · 593 阅读 · 0 评论 -
【2.11】VS调试技巧(strcpy模拟实现)
目录1.什么是bug2.调试 Debug3. 调试解决死循环4.模拟实现strcpy4.1 第一种(6分实现)4.2 第二种(7分实现)4.3 第三种(8分实现)4.4 第四种(10分实现)5.编程常见的错误1.什么是bug发现bug的顺序:程序员、测试 / 测试开发(测试程序的正确性、软件测试人员)、用户2.调试 Debug在项目文件夹下(test):Debug调试版本:包含调试信息、便于调试、文件大 Release发布版本:对代码进原创 2022-05-02 08:11:01 · 375 阅读 · 0 评论 -
【2.10】初识结构体
1.结构体创建学生的结构体类型这里创建s1的全局变量要是给数组name赋值的话,不能用等号 数组除了初始化,在想赋值的话不能用等号2. typedef将struct Stu类型重定义为Stu 这里的s1和s2没有区别3.结构成员的类型4.结构体传参传值:传址:Print2传址方法好一点:5. 压栈栈区:局部变量、函数形参 堆区:动态内存开辟的空间 静态区:全局变量、static...原创 2022-05-02 06:46:45 · 251 阅读 · 0 评论 -
【2.9】初识指针(作业讲解)
目录1.练习题:第一题:第二题:2.编程题2.1 求整数补码中1的个数2.2 比较两个数二进制中不同位的个数2.3 字符串逆序2.4 计算数字各个位置的和(递归实现)2.5 递归实现n的k次方1.练习题:第一题:因为sizeof返回的是一个无符号数,sizeof(i)就是无符号的4 i--虽然为-1,但是会发生算术转换,转换成两个无符号数相减 -1内存的补码是全1,那么将它看成一个无符号数是一个很大的数字 所以打印结果:>第二题:原创 2022-04-30 22:04:40 · 307 阅读 · 0 评论 -
【2.8】初识指针
目录1.指针是什么2.指针类型3. 野指针4.指针运算指针模拟strlen5.二级指针6.指针数组1.指针是什么32位平台上:4字节 64位平台上:8字节2.指针类型指针类型决定了:指针进行解引用的时候,能够访问空间的大小指针+-整数的时候指针类型决定了:指针走一步能走多远(指针的步长)3. 野指针野指针:指向的位置不可知未初始化:int* p ; 局部变量为初始化,会放随机值。全局变量不初始化,回..原创 2022-04-30 21:09:51 · 268 阅读 · 0 评论 -
【2.7】表达式求值(类型转换)
目录1.表达式求值2.隐式类型转换2.1 (整型提升)2.1.1练习2.1.2练习2.2 算术转换3.操作符的属性1.表达式求值2.隐式类型转换2.1 (整型提升)首先,3是一个整数,占32位比特的内存空间 ,3的补码是下面这个。但是类型是char一个字节,所以按规定取低八位放到char a里面(a-0000 0011)127也是一个整数,占32位比特的内存空间 ,127的补码是下面这个。但是类型是char一个字节,所以按规定...原创 2022-04-29 23:31:02 · 259 阅读 · 0 评论 -
【2.6】操作符
目录1.算术操作符2.移位操作符3.位操作符4.赋值操作符5.单目操作符6.关系操作符7.逻辑操作符8.条件操作符(三目操作符)9.逗号表达式10.下标引用、函数调用和结构成员1.算术操作符/ 取商,不会得出小数 % 两端不能有浮点数,char也行,因为内存中存的是ASCII码 / 想要得到小数,两端最起码有一个浮点数2.移位操作符移位操作符:移动的是二进制位、移动补码、作用于整数 对于移位操作符,不要移动负数位...原创 2022-04-29 21:21:39 · 356 阅读 · 0 评论 -
【2.5】数组
目录1.数组2.二维数组3. 数组名3.1 数组传参3.2冒泡排序 bubble_sort1.数组创建数组[]:里面需要常量 / 常量表达式 数组不完全初始化:剩下的默认元素是 0 创建字符数组:里面的数字被转化成ASCII码对应的字符 数组在内存中连续存放,且地址由低到高未指定大小的数组,会根据内容初始化自动分配空间大小,所以sizeof都是确定的分析:sizeof计算的是所占空间大小,这里应该是6+1( ' \0' )个字节...原创 2022-04-28 16:48:35 · 234 阅读 · 0 评论 -
【2.4】函数(递归)
目录1.函数递归2.C语言内存空间划分区域3.练习3.1 按照顺序打印数字3.2 递归实现strlen3.2.1 用临时变量实现strlen3.2.2 递归实现strlen3.3 斐波那契数列1.函数递归什么是函数递归?(recursion)函数递归的条件:递归存在出口,满足这个出口也就是递归条件,就会跳出递归 每次递归要逐渐逼近这个递归条件常见的递归错误:stack overflow 栈溢出递归相当于每次调用自己,所以函数可以嵌套调用,但是不原创 2022-04-27 21:58:02 · 792 阅读 · 0 评论 -
【2.3】函数
目录1.C语言的函数2.常见库函数1. strcpy ----> 字符串拷贝函数2. memset -----> 内存设置函数3.自定义函数3.1 函数的形参和实参3.2 函数的声明和实现3.3 函数声明和定义的具体使用1.C语言的函数C函数:库函数、自定义函数c语言程序的基本单位是函数,函数是C程序的基本组成单位 一个C语言程序中仅有一个main函数,除main函数之外可以有若干个其它的函数,每个函数实现某一特定的操作。 常见库函数:I原创 2022-04-27 20:46:58 · 74 阅读 · 0 评论 -
【2.2】分支和循环(goto语句)
目录1.goto语句2.goto语句实现关机程序1.goto语句goto语句:配合标签使用但是没有goto跳转,3也会被打印goto语句的真正使用场景 如果使用break,需要好几个break,没有goto方便2.goto语句实现关机程序#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <stdlib.h>#include <st..原创 2022-04-27 16:28:52 · 111 阅读 · 0 评论 -
【2.1】分支和循环(练习题)
1.二分查找需要有序数组 最多查找log2(n)次2.字符闪烁出现计算righ的时候,如果是sizeof,需要-2。因为字符串后面的 \0 也占一个位置 system 系统命令(Dos命令)需要头文件:stdlib Sleep函数需要头文件:windows 头文件不需要区别大小写,其余的标识符严格区分大小写 引用了对应的头文件,编译器才会有智能提示。想要看对应的函数定义,需要引头文件3.模拟用户登录比较两个字符串相等,不能用等号(=)。需要strcmp,.原创 2022-04-27 14:43:39 · 68 阅读 · 0 评论 -
【2】分支和循环
目录1.C语言2.分支语句2.1if分支语句2.2switch分支语句3.循环3.1while循环3.2 for循环3.3 do..while 循环4.getchar、putchar 的使用4.1 EOF 文件结束标志4.2 实际用途1.C语言C语言是一门结构化的程序设计语言顺序结构 选择结构 循环结构2.分支语句语句:C语言中一个分号隔开的就是一条语句,如果一行只有分号(;)那么是空语句C语言在编译扫描的时候,会将一条语句的分号作为原创 2022-04-21 20:57:24 · 827 阅读 · 0 评论 -
【1.6】初识C语言(结构体)
1.结构体结构体:表达复杂对象,我们自己创造的一种类型------->结构体(struct)注意:这里价格是个短整形变量short如果想要改变,直接b1.price = 10;就行。但是name是数组,数组的内容不可以用等号=更改内容,除了初始定义可以price是变量,变量可以重新赋值 name其实是数组,数组名是个地址,不可以赋值2.结构体用指针操作. 结构体变量.成员 -> 结构体指针->成员...原创 2022-04-20 15:53:31 · 705 阅读 · 0 评论 -
【1.5】初识C语言(define、指针)
目录1.define1.1定义标识符常量1.2定义宏2.指针1.define1.1定义标识符常量#define MAX 10注意:define定义的标识符常量,通常名字全都大写,只是做简单的替换因为define是指令,不是关键字,只有在预处理的时候完成替换,所有后面没有分号(;)(如果擅自添加分号的话,就会将分号也替换过去,造成语法错误)1.2定义宏define可以定义宏完成类似的函数操作,只做简单了解,后面会详细介绍2.指针.原创 2022-04-17 01:17:52 · 627 阅读 · 0 评论 -
【1.4】初识C语言(关键字)
1.C语言常见关键字auto:局部变量,自动创建,自动销毁,所以也叫自动变量int a = auto int a(局部变量前都有auto,干脆全部省略了)break、continue用于跳出循环 switch....case....default分支语句 char、double、float、int、long、short、signed、unsigned定义变量类型int a其实是signed int a;只不过通常signed会被省略const修饰常变量,不可修改 do...whi原创 2022-04-14 17:17:32 · 334 阅读 · 0 评论 -
【1.3】初识C语言(操作符)
目录1.算术操作符2.移位操作符3.位操作符4.赋值操作符5.单目操作符:6.关系操作符7.逻辑操作符8.条件操作符9.逗号表达式10.下标引用、调用函数和结构成员11.原码、反码、补码1.算术操作符算术操作符:+、-、*、/、%2.移位操作符移位操作符:>>、<<(移动的是二进制位)注意:a<<1,对a没有影响,不会发生变化。a=a<<1或者a<<=1才会变化原创 2022-04-13 13:52:57 · 352 阅读 · 0 评论 -
【1.2】初识C语言(字符串)
0.字符串“”中的就是字符串ASCII原创 2022-03-15 19:37:25 · 1111 阅读 · 0 评论 -
【1.1】初识C语言(变量、常量)
0.变量如果编程的时候,想要存储个数据,就要在电脑内存里找个空间存放,而变量就是存放数据空间的名称。C语言对数据划分的很严格,存放数据的时候要考虑数据是整数、小数还是字符。char是字符型,代表要存放的数据是个字符。int是整型,flaot是单精度浮点型,double是双精度浮点型。小数在内存中默认使用双精度浮点型double所以第8行,10.1是double类型,会有警告精度丢失。第七行没有的原因是因为10.0小点数后面没有数字,和10等价,就不存在单精度还是双精度的问题了。而在原创 2022-03-14 14:25:03 · 680 阅读 · 0 评论 -
【1.0】初识C语言(C语言介绍)
0.C语言介绍C语言是一门程序编程语言。generally speaking,C语言是编程之本,C生万物,是人机交互接近底层的桥梁。在编程语言的排行榜中,C语言长期占据着前三名,C语言永远不会过时。1.原创 2022-03-14 12:36:13 · 1669 阅读 · 0 评论 -
【0】VS对不安全函数报错的解决方案
目录1.C语言:不安全函数2.报错原因分析3.解决办法3.1预处理3.1.1 程序第一行添加预处理3.1.2 定义预处理器3.2 取消安全检查3.3newc++file.cpp文件1.C语言:不安全函数 VS编译器有时候会对C标准的一些函数报错,比如scanf、strcpy函数等等。例如 报错信息:这个函数不安全,建议使用scanf_s代替。像这种类似的_s函数都是VS编译器提供的,换言之,VS认为C...原创 2022-03-10 21:28:18 · 2096 阅读 · 1 评论