C语言学习笔记
杨柳_
Java服务端研发,喜欢底层原理与基础算法设计
展开
-
C语言进阶深度学习目录表
学习交流加个人qq:1126137994个人微信:liu1126137994学习交流资源分享qq群:962535112本文是我的博客专栏【C语言深度剖析学习记录】的所有文章的目录汇总。本博客专栏参考了狄泰软件学院唐佐林的C语言教程。由于本人水平有限,博客中可能存在错误或者表述有问题,还请评论指出【C语言进阶深度学习目录】【C语言进阶深度学习记录】一 数...原创 2019-03-06 22:55:50 · 6656 阅读 · 4 评论 -
【C语言进阶深度学习记录】三十二 函数指针与使用函数指针实现回调函数
回调函数是非常重要的概念文章目录1 函数的类型2 函数指针2.1 函数指针的使用2.2 使用函数指针实现回调函数3 总结1 函数的类型跟以前学数组的时候是一样的,C语言中的数组是有自己的类型的。函数也是有自己的类型的。函数的类型由返回值、参数的类型、参数的个数共同决定比如函数int add(int i, int j); 的函数类型是int (int, int)在C语言中...原创 2019-03-02 23:18:41 · 1347 阅读 · 2 评论 -
【C语言进阶深度学习记录】二十七 C语言中字符串的相等比较
文章目录1 字符串的相等比较1.1 代码分析1 字符串的相等比较如果有字符串s1 = “Hello”; s2 = “Hello” ;在我们看来s1与s2相等。但是如果使用 “==” 来判断是不准确的。因为在代码中s1与s2是是不同的字符串,它们位于不同的呢村空间(当然,有的编译器进行优化,直接将s1与s2指向同一个内存中的"Hello",但是正常来讲s1与s2是指向两个不同地址中的长得一...原创 2019-02-27 23:40:28 · 2987 阅读 · 2 评论 -
【C语言进阶深度学习记录】十四 C语言中 三目运算符和逗号表达式
文章目录1 三目运算符1.1 三目运算符的返回类型的代码案例分析2 逗号表达式2.1 逗号表达式代码案例分析2.2 如何用一行代码实现 strlen函数3 总结1 三目运算符三目运算符(a?b:c)可以作为逻辑运算的载体规则: 当a为真时,返回b,否则返回c的值如下面的代码:#include <stdio.h>int main(){ int a = 1;...原创 2019-02-21 22:57:54 · 2618 阅读 · 0 评论 -
【C语言进阶深度学习记录】二十六 C语言中的字符串与字符数组的详细分析
之前有一篇文章是学习了字符和字符串的,可以与之结合学习:【C语言进阶深度学习记录】十二 C语言中的:字符和字符串文章目录1 字符串的概念1.1 字符串与字符数组1.2 字符数组与字符串代码分析2 字符串字面量2.1 字符串字面量的本质的代码分析3 字符串的长度3.1 strlen 的使用代码分析4 总结1 字符串的概念字符串与字符数组很像,但是有差别,注意留意它们的差别。字符串是...原创 2019-02-27 23:40:06 · 1558 阅读 · 0 评论 -
【C语言进阶深度学习记录】十三 C语言中 ++和--操作符
文章目录1 ++和--操作符的本质2 总结1 ++和–操作符的本质++ 和 - - 操作符对应两条汇编指令前置:变量自增(减)1取变量值后置取变量值变量字增(减)1上述只是定义了 ++ 和 - - 操作符本身的取值与自增加减顺序。但是如果多个 ++ 或者 - - 操作符放在一起进行运算呢?像下面这样?你觉得上述两个表达式的值分别是多少?或许...原创 2019-02-20 22:31:17 · 2794 阅读 · 8 评论 -
【C语言进阶深度学习记录】二十五 指针与数组的本质分析二
文章目录1 数组的访问方式1.1 数组的访问方式代码分析2 数组和指针不同3 a 和 &a 的区别3.1 指针运算的经典代码案例分析4 数组作为函数的参数4.1 数组作为函数参数的代码案例分析5 总结开题问:数组名可以当做常量指针使用。那么指针是否可以当做数组来使用?1 数组的访问方式以下标的形式访问数组中的元素:以指针的形式访问数组中的元素下标形式与指针形式的转...原创 2019-02-26 23:57:35 · 1708 阅读 · 1 评论 -
【C语言进阶深度学习记录】二十四 指针与数组的本质分析一
文章目录1 回顾--数组的本质2 指针的运算2.1 指针运算代码案例分析3 指针的比较3.1 指针运算的应用代码案例分析4 总结1 回顾–数组的本质在之前的文章,已经学习了数组的本质分析。下面再来回顾一下:数组是一段连续的内存空间数组名可以看做是指向数组第一个元素的常量指针那么数组名加1的意义是什么?指针运算呢?看一下代码:28-1.c#include <stdi...原创 2019-02-26 23:34:50 · 1598 阅读 · 0 评论 -
【C语言进阶深度学习记录】十二 C语言中的:字符和字符串
文章目录1 C语言中的单引号和双引号1.1 双引号带来的BUG2 总结1 C语言中的单引号和双引号C语言中的单引号用来表示字符字面量C语言中的双引号用来表示字符串字面量注意上面的字符与字符串的区别下面的程序片段是否合法?上面额三行代码,看着像是很正常,实际上问题很大。在具体分析上述代码问题之前,我们先给出一个代码示例来看看:代码 14-1.c#include...原创 2019-02-20 22:31:11 · 852 阅读 · 0 评论 -
【C语言进阶深度学习记录】十五 编译过程简介
文章目录1 初识编译器2 总结1 初识编译器我们平时口中所说的编译器,是广泛的编译器。实际上,编译器包括了以下四个部分:一个C代码被编译为可执行代码,包括以下几个过程:下面就对上述的各个过程进行一个详细的说明:预编译处理所有的注释,以空格代替将所有的#define 进行宏展开处理条件编译指令 #if , #ifdef, #elif , #else , #endif...原创 2019-02-21 23:14:37 · 1443 阅读 · 2 评论 -
【C语言进阶深度学习记录】二十八 数组指针与指针数组的分析
数组指针与指针数是非常重要的概念。面试中也是经常会被问到的文章目录1 数组的类型1.1 定义数组的类型2 数组指针2.1 数组类型和数组指针的代码分析3 指针数组3.1 指针数组代码案例分析4 总结1 数组的类型C语言中的数组有自己特定的类型。比如 int a[5];数组a的类型是 int[5],并不是 int类型。数组类型是由元素类型和数组大小共同决定的1.1 定义数组的...原创 2019-02-28 23:42:20 · 950 阅读 · 0 评论 -
【C语言进阶深度学习记录】三十七 C/C++中造成程序内存错误的原因(野指针)
什么是野指针? 指针变量存的地址是一块非法内存地址。进而形成野指针。但是需要注意一点,野指针不是NULL指针。文章目录1 野指针的概念1.1 野指针代码案例初探2 如何避免野指针2.1 野指针代码案例分析进阶3 总结1 野指针的概念野指针变量中的值是非法内存地址,进而形成野指针野指针不是NULL指针,是指向不可用内存的地址的指针NULL指针并无危害,很好判断,也很好调试C语言...原创 2019-03-04 23:05:54 · 1691 阅读 · 0 评论 -
【C语言进阶深度学习记录】三十九 C语言中的可变参数(参数可变的函数)
用过printf()函数的热都知道,printf的参数可以有多个,它是可变的,根据我们输出参数的类型以及个数的不同来确定参数。今天来学习C语言中参数可变的函数是如何实现的。文章目录1 可变参数2 总结1 可变参数首先我们要明白一点,在C语言中,参数可变的函数的实现,要依赖于头文件stdarg.h。所以在实现这样的函数的时候,需要包含该头文件。其次,实现函数可变参数需要使用以下几个类...原创 2019-03-06 22:43:21 · 1260 阅读 · 0 评论 -
【C语言进阶深度学习记录】三十六 程序与进程的区别(程序的内存布局)
上一篇文章学了堆,栈以及静态存储区。它们实际上都是针对进程来说的。那么程序与进程有什么区别呢?本文不细讲程序与进程。1 程序与进程1.1 什么是程序写完的.c文件是源文件。也叫源代码。将源代码编译后,会生成可执行文件程序(Linux下是.out,windows下是.exe)。这个文件就是程序。也叫作可执行代码。比如下面的源代码对应的可执行文件的内容:那么程序文件中,各个段的...原创 2019-03-04 23:02:49 · 1408 阅读 · 0 评论 -
【C语言进阶深度学习记录】三十五 程序中的堆、栈以及静态存储区(数据区)
学习交流加个人qq:1126137994个人微信:liu1126137994学习交流资源分享qq群:962535112在我之前学习底层的知识的时候,也写过相关的内容。可以对比的学习:【软件开发底层知识修炼】二十 深入理解可执行程序的结构,【软件开发底层知识修炼】二十三 ABI-应用程序二进制接口三之深入理解函数栈帧的形成与摧毁学习本文的前提是了解进程的内存布局空间。可...原创 2019-03-03 23:14:48 · 1538 阅读 · 0 评论 -
【C语言进阶深度学习记录】三十四 C语言实现内存泄漏检测模块
上一篇文章学习了malloc系列的三个函数的使用。众所周知malloc的使用很容易导致内存泄漏。本文的目的就是使用C语言来实现内存泄漏检测模块,来帮忙自动检测我们写的程序中是否出现内存泄露。文章目录1 内存泄露检测模块的实现原理1.1 各个函数模块的设计1.2 模块整合2 总结1 内存泄露检测模块的实现原理想要实现内存泄露检测模块,必须在内存申请的时候将申请的内存位置,在代码的哪个位...原创 2019-03-03 22:53:07 · 1808 阅读 · 0 评论 -
【C语言进阶深度学习记录】二十九 main函数与命令行参数
文章目录1 main函数的返回值2 main函数的参数2.1 main函数的参数的代码案例分析3 main函数不一定是程序中第一个执行的函数4 总结1 main函数的返回值main函数是操作系统调用的函数操作系统总是将main函数的返回值作为程序的退出状态main函数的返回值正常来说是0,如果是其他值,就是错误的状态。2 main函数的参数程序执行的时候可以向main函数传递...原创 2019-03-01 00:01:34 · 1688 阅读 · 0 评论 -
【C语言进阶深度学习记录】三十八 C/C++语言中的函数声明与函数定义
文章目录1 函数的声明和定义1.1 代码分析2 总结1 函数的声明和定义声明的意义在于告诉编译器程序单元的存在。只是告诉编译器它存在但是不在声明这里定义,有可能在当前文件中的其他地方或者其他文件中定义。如果在它还没有被定义之前就使用它,会导致编译错误定义则明确表示程序单元的意义C语言中,通过关键字extern进行程序单元的声明。现在的编译器可以省略不写,大多时候都是直接省略。注...原创 2019-03-05 23:45:04 · 1441 阅读 · 0 评论 -
【C语言进阶深度学习记录】三十三 C语言中动态内存分配
如何在程序运行的时候动态给程序分配内存?文章目录1 动态内存分配的意义1.1 C语言中如何动态申请内存空间1.2 malloc和free的用法1.3 calloc与realloc1.31 calloc和realloc的代码案例分析2 总结1 动态内存分配的意义在C语言中,一切操作都是基于内存的。变量和数组名都是内存别名。但是它们的内存分配却是在编译期间由编译器决定的。定义数组的长度的...原创 2019-03-02 23:57:13 · 3263 阅读 · 0 评论 -
【C语言进阶深度学习记录】十一 C语言中enum,sizeof,typedef分析
文章目录1 enum 枚举类型的使用方法1.1 enum枚举类型的特殊意义1.2 代码分析:enum的使用2 sizeof 关键字的用法2.1 代码案例分析:sizeof的本质3 typedef的意义3.1 代码案例:typedef 的使用案例4 总结1 enum 枚举类型的使用方法enum是C语言中的一种自定义类型enum是可以根据需要自定义的整形值第一个自定义的enum值默认为0...原创 2019-02-19 23:17:40 · 1522 阅读 · 0 评论 -
【C语言进阶深度学习记录】十 C语言中:struct的柔性数组和union分析
本文并不讲C语言的基础文章目录1 空struct的大小2 结构体与柔性数组2.1 柔性数组的使用方法2.2 柔性数组使用代码案例分析3 C语言中的union分析3.1 使用union判断系统大小端4 总结1 空struct的大小C语言中的struct可以看成是变量的集合如果一个struct里面什么都没有,是空的,那么它的大小是多少呢?(不考虑C++语言的特性)实际上这在不同...原创 2019-02-19 22:34:02 · 1589 阅读 · 3 评论 -
【C语言进阶深度学习记录】二十三 数组的本质分析
文章目录1 数组的概念1.1 数组的大小1.2 数组的初始化2 数组的地址与数组名3 数组名不能作为右值使用4 总结1 数组的概念数组是相同类型的变量的有序集合数组中的元素没有名字如下图是一个数组:1.1 数组的大小数组的大小是数组元素个数乘以元素的数据类型数组在一片连续的内存空间中存储元素数组元素的个数可以显示或者隐式的指定那么数组a[0]=1,a[1]=2,a...原创 2019-02-25 23:28:41 · 1701 阅读 · 0 评论 -
【C语言进阶深度学习记录】八 C语言中void的分析
文章目录1 void的意义1.1 不存在void变量1.2 C标准1.3 void指针的意义1.4 通过void* 实现memset函数2 总结1 void的意义void修饰函数的参数和返回值的时候:如果函数没有返回值应该将其返回值声明为void如果函数没有参数,应该将函数的参数声明为void如果没有参数,并且不声明为void,则函数参数默认是任意的,比如main函数如果函数没有返回...原创 2019-02-16 22:30:27 · 1597 阅读 · 0 评论 -
【C语言进阶深度学习记录】七 C语言中的循环语句
文章目录1 循环语句分析1.1 do...while循环1.2 while循环1.3 for循环1.4 三种循环语句使用对比2 break和continue的区别3 总结1 循环语句分析C语言中的循环语句主要有for循环,while循环和do…while循环。循环语句的基本工作方式:通过条件表达式判断是否执行循环体条件表达式遵循if 语句的表达式原则do,while,for的区别...原创 2019-02-15 22:55:08 · 3588 阅读 · 0 评论 -
【C语言进阶深度学习记录】六 C语言中的分支语句
文章目录1 if 语句的分析1.1 if 语句中零值比较的注意点2 switch 语句的分析3 if 与switch语句使用代码案例分析4 if语句与switch语句的互换5 总结1 if 语句的分析if 语句根据条件选择执行语句else 不能独立存在,且总是与距离它最近的if匹配else 语句可以连接其他if语句1.1 if 语句中零值比较的注意点bool 型变量应该直接出现...原创 2019-02-15 22:54:40 · 1369 阅读 · 0 评论 -
【C语言进阶深度学习记录】四 C语言中的类型转换
今天学习C语言中的类型转换,包括隐式类型转换和显示类型转换文章目录1 C语言中的数据类型转换1.1 强制类型转换1.11 强制类型转换代码分析1.2 隐式类型转换1.21 隐式类型转换代码分析2 总结1 C语言中的数据类型转换C语言中,可以进行数据类型转换。有以下两种数据类型转换:强制类型数据转换隐式类型数据转换如下图:1.1 强制类型转换强制类型转换的语法为:(Ty...原创 2019-01-30 00:18:22 · 1818 阅读 · 0 评论 -
【C语言进阶深度学习记录】五 C语言中变量的属性
上一篇文章学习了C语言中的类型转换,点击链接查看:【C语言进阶深度学习记录】四 C语言中的类型转换.文章目录1 C语言的变量属性1.1 auto关键字1.2 register关键字1.3 static 关键字1.4 代码案例分析1.5 extern 关键字1.6 代码案例分析2 总结1 C语言的变量属性C语言中的变量可以有自己的属性在定义变量的时候可以加上“属性”关键字属性关键字,...原创 2019-02-14 22:32:10 · 1534 阅读 · 0 评论 -
【C语言进阶深度学习记录】三 浮点数(float) 在内存中的表示方法
相信大多数人知道整形数在内存中的分布方式,而且也能很容易写出其二进制的形式,但是对于浮点数,估计知道的人并不是很多今天学习在C语言中浮点数在内存中的表示方法文章目录1 浮点数在内存中的存储方式1.1 浮点数的转换步骤1.2 浮点数的转换实际例子分析1.3 编程验证测试2 int与float类型的范围的比较2.1 float数不精确的编码案例3 总结1 浮点数在内存中的存储方式浮点...原创 2019-01-29 00:07:10 · 4378 阅读 · 2 评论 -
【C语言进阶深度学习记录】二 有符号与无符号
今天学习C语言中的有符号与无符号1 计算机中的符号位C语言中,数据类型的最高位,用于标识数据的符号。最高位为1,表明这个数为负数最高位为0,表明这个数为正数比如下图:1.1 有符号数的表示法在计算机内部用补码表示负数正数的补码为正数本身负数的补码为负数的绝对值各位取反后加1比如下图中的:1.2 无符号数的表示法在计算机内部,用源码表示无符号数。...原创 2019-01-28 01:28:50 · 1783 阅读 · 0 评论 -
【C语言进阶深度学习记录】一 数据类型的本质与变量的本质
今天学习C语言中的数据类型的本质与变量的本质文章目录1 什么是数据类型2 变量的本质3 数据类型与变量的关系4 自定义数据类型与创建变量5 总结1 什么是数据类型数据类型可以理解为固定内存大小的别名数据类型是创建变量的模子如同下面的图示,各个数据类型是代表了某一个固定大小的内存,数据类型是这块内存的别名。然后,当我们要创建一个变量时,就使用上述的基本数据类型为模子,产生一个新...原创 2019-01-26 23:53:35 · 2702 阅读 · 2 评论 -
【C语言进阶深度学习记录】十六 静态库与动态库的创建与使用
上一篇文章学习了编译的过程,点击链接查看:【C语言进阶深度学习记录】十五 编译过程简介,每一个C源文件编译后将会生成目标文件,那么这些目标文件,还需要链接起来,生成可执行文件。文章目录1 链接的意义1.1 静态链接1.11 Linux下静态库的创建和使用1 链接的意义链接的主要作用就是把各个模块之间的相互引用的部分处理好,使得各个模块之间能够正确的衔接。像下图这样:1.1 静态链...原创 2019-02-22 22:30:37 · 1187 阅读 · 0 评论 -
【C语言进阶深度学习记录】十七 宏定义的使用与分析
文章目录1 C语言中的宏定义1.1 定义宏常量1.2 宏定义表达式1.3 宏表达式与函数的对比1.4 宏表达式的作用域2 C语言中的内置宏3 宏定义的代码综合示例4 总结1 C语言中的宏定义#define 是预处理器处理的单元实体之一#define 定义的宏,可以出现在程序的任意位置#define 定义之后的代码,都可以使用这个宏因为宏定义是在预处理器处理的,所以如果怀疑是宏...原创 2019-02-23 00:00:17 · 1596 阅读 · 0 评论 -
【C语言进阶深度学习记录】二十二 指针的本质分析
在C语言中,最难的也就是指针了。如果我们了解了指针的本质,它就会变得简单文章目录1 回顾:什么是变量?1.1 *号的意义1.2 指针使用示例2 传值调用与传址调用2.1 利用指针交换两个变量3 const与指针的配合3.1 const指针代码分析4 总结1 回顾:什么是变量?程序中的变量只是一段存储空间的别名,那么是不是必须通过这个别名才能使用这段存储空间呢?如果有一定的C语言的基...原创 2019-02-25 23:27:22 · 1642 阅读 · 0 评论 -
【C语言进阶深度学习记录】九 C语言中const的详细分析
文章目录1 const的分析2 const本质的分析实验2.1 代码案例分析3 const修饰函数参数和返回值时的情况3.1 代码案例分析4 总结1 const的分析不管是C语言还是C++语言,const都是一个非常重要的关键字。今天这篇文章着重学习记录C语言中的const。C++语言中稍有不同。在C语言中:const修饰的变量是只读的,本质上还是变量。注意,不是常量。const修...原创 2019-02-18 22:58:04 · 1535 阅读 · 0 评论 -
【C语言进阶深度学习记录】二十一 # 和 ## 号操作符的使用与分析
文章目录1 # 运算符1.1 # 运算符的基本用法1.2 # 运算符的妙用2 ## 运算符2.1 ##运算符的基本用法2.2 ##运算符的工程运用3 总结1 # 运算符#运算符用于在预处理期将宏参数转换为字符串#的转换是在预处理期间完成的,因此,只在宏定义中有效编译器并不知道 # 的转换作用用法如下:1.1 # 运算符的基本用法代码:25-1.c#include &l...原创 2019-02-24 23:03:29 · 6054 阅读 · 1 评论 -
【C语言进阶深度学习记录】二十 结构体大小计算与结构体内存布局的详细方法
结构体大小的计算往往是面试笔试常考的知识。对于简单的结构体,可以一眼看出来,对于复杂的结构体,该如何计算结构体占用内存的大小呢?文章目录1 什么是内存对齐?2 struct占用的内存大小如何计算2.1 struct结构体大小计算案例分析-结构体中没有结构体2.2 struct结构体大小计算案例分析-结构体中有一个结构体成员3 总结1 什么是内存对齐?先来加单的说一下为什么需要内存...原创 2019-02-24 23:18:04 · 1589 阅读 · 0 评论 -
【C语言进阶深度学习记录】十九 #pragma使用与分析
文章目录1 #pragma 概念简介1.1 #pragma message 的用法1.2 #pragma once 的用法1.3 #pragma pack 的用法1.31 struct占用的内存大小如何计算2 总结在学习 #pragma 之前 ,我们首先要明白一点, #pragme 的实现,在不同的编译器之间是不同的,所以使用它的代码,基本上不能移植代码。但是它也有它自己的用处,还是要学习以...原创 2019-02-23 23:33:31 · 2410 阅读 · 2 评论 -
【C语言进阶深度学习记录】十八 条件编译的使用与分析
文章目录1 基本概念1 基本概念条件编译的行为类似于C语言中的if … else…条件编译是预编译指示指令,用于控制是否编译某段代码比如下图的代码:上面的 #if、#else、#endif 就是条件编译的构成当然,还有其他的样式,后面会通过例子详细说明。...原创 2019-02-23 23:15:45 · 1110 阅读 · 0 评论 -
【C语言进阶深度学习记录】三十一 数组作为函数参数时退化为指针
之前的学习数组的文章中,已经知道一维数组作为函数参数的时候,最终会被编译器编译为指针。今天来看看二维数组的情形文章目录1 为什么C语言中的数组作为函数参数会退化为指针?2 二维数组作为函数参数如何退化2.1 代码案例分析(传递二维数组给函数参数)3 总结1 为什么C语言中的数组作为函数参数会退化为指针?C语言是一种高效的语言:当参数传递的时候如果将整个数组都拷贝过来的话,拷贝数组...原创 2019-03-01 23:26:24 · 1485 阅读 · 1 评论 -
【C语言进阶深度学习记录】三十 二维数组与二维指针
文章目录1 二维指针(指向指针的指针)1 二维指针(指向指针的指针)指针的本质是变量指针的指针是保存指针变量的地址。如下面的代码:为什么需要指向指针的存在?还记得之前学习的过程中说的函数传值调用和传址调用么?当要在函数内部修改传进来参数变量的时候,需要传址调用。同理,如果传进来的本来就是一个指针,想要修改该指针,那么就需要传指向该指针的指针了。道理是一样的。看下面的代码就明白了...原创 2019-03-01 23:26:00 · 1414 阅读 · 0 评论