
C语言
文章平均质量分 88
The August
这个作者很懒,什么都没留下…
展开
-
函数栈帧的创建与销毁
函数栈帧的创建与销毁前言知识储备寄存器三级目录前言本章讲解的函数栈帧的创建与销毁,在不同编译器下,函数调用中栈帧的创建略有差异,具体细节取决于编译器,但大体逻辑是一致的。(在使用编译器时,建议不要使用太高级的编译器,编译器越高级,越智能,越不容易观察。)知识储备寄存器esp,ebp这两个寄存器存放的是地址,这两个地址是用来维护函数栈帧的。esp:栈顶指针ebp:栈底指针三级目录...原创 2023-06-11 20:36:49 · 783 阅读 · 27 评论 -
C语言—程序环境和预处理
预处理 选项 gcc -E test.c -o test.i预处理完成之后就停下来,预处理之后产生的结果都放在test.i文件中。编译 选项 gcc -S test.c编译完成之后就停下来,结果保存在test.s中。汇编 gcc -c test.c汇编完成之后就停下来,结果保存在test.o中。VIM的相关命令Linux环境基础开发工具使用预定义符号在预处理阶段被处理的已经定义好的这种符号,这些符号是可以直接被使用的。预定义符号是C语言已经内置好的。原创 2023-06-11 12:38:16 · 1148 阅读 · 8 评论 -
C语言—文件操作
进程与进程概念fork二级目录三级目录fork如何理解fork程序员角度:fork之后,父子共享用户代码(代码是可读的,不可修改或者写入),而用户数据各自私有一份(不让进程互相干扰)。操作系统中,所有进程,进程具有独立性的(操作系统所表现出来的)。内核角度:fork之后,创建子进程,通常以父进程为模板其中子进程默认使用的是父进程的代码和数据(除一些pid、ppid等)(数据用写时拷贝来写)进程=自己的程序代码+内核数据结构(task_struct)二级目录三级目录...原创 2023-06-02 17:02:13 · 942 阅读 · 26 评论 -
C语言—通讯录(可保存通讯录信息)
在写完通讯录的程序时,当通讯录运行起来的时候,可以给通讯录中增加、删除数据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了,等下次运行通讯录程序的时候,数据又得重新录入,如果使用这样的通讯录就很难受。既然是通讯录就应该把信息记录下来,只有当选择删除数据的时候,数据才不复存在。这就涉及到了数据持久化的问题,一般数据持久化的方法有把数据存放在磁盘文件、存放到数据库等方式。使用文件可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。原创 2023-06-01 18:58:49 · 1296 阅读 · 7 评论 -
C语言—动态内存管理
malloc函数的介绍:malloc函数用于开辟(申请)内存块(动态内存开辟)这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。如果开辟成功,则返回一个指向开辟好空间的指针。如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。原创 2023-05-27 11:26:52 · 1148 阅读 · 14 评论 -
C语言—通讯录(动态内存开辟)
字符串函数及字符函数字符串函数求字符串长度strlenstrlen函数的模拟实现长度不受限制的字符串函数strcpystrcpy函数的模拟实现strcatstrcat函数的模拟实现strcmp字符串函数求字符串长度strlen字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。参数指向的字符串必须要以 ‘\0’ 结束。注意函数的返回值为size_t,是无符号的( 易错 )strlen函数的模拟实现#prag原创 2023-05-25 14:03:30 · 745 阅读 · 13 评论 -
C语言—通讯录
但是当要操作通讯录中联系人的信息内容时,比如增加联系人信息,这时就需要知道通讯录中的联系人是否已经到达上限或者需要知道在哪个位置添加人的信息(需要知道当前通讯录中有几个人的信息),如果达到上限就无法再添加联系人。添加联系人时需要注意如果通讯录满了就不能再添加了,如果通讯录没满需要注意通讯录添加联系人信息的位置正好是已知记录当前通讯录中有效信息的个数所在联系人信息数组的下标的位置。在通讯录查找特定联系人信息,如果找到将查找函数返回的通讯录中联系人信息所在下标并打印通讯录中特定联系人信息的内容。原创 2023-05-21 13:40:31 · 1755 阅读 · 18 评论 -
C语言—自定义类型(结构体、枚举、联合)
int x;int y;} p1;//声明类型的同时定义变量p1 struct Point p2;//定义结构体变量p2 //初始化:定义变量的同时赋初值。x , y };struct Stu //类型声明 {//名字 int age;//年龄 };//初始化 struct Node {int data;} n1 = {10 , {//结构体嵌套初始化 struct Node n2 = {20 , {//结构体嵌套初始化struct S {char c;原创 2023-05-20 17:22:28 · 677 阅读 · 5 评论 -
C语言—字符函数和字符串函数
注:C语言标准规定strcmp库函数实现时满足如果第一个字符串大于第二个字符串返回大于零的数,如果第一个字符串小于第二个字符串返回小于零的数,如果第一个字符串等于第二个字符串返回等于零的数即可。这只是在VS编译器中strcmp返回值是这样的而在其他编译器下strcmp的返回值就不一定是1,-1,0,但是在所有编译器下strcmp函数的返回值一定是大于零、小于零、等于零(因为这是C语言标准规定的)这样的字节拷贝方法(在.c源文件下可以编过,但在.cpp源文件下不可以编过(这种方法是有问题的))。原创 2023-05-12 18:09:19 · 853 阅读 · 19 评论 -
C语言—指针的进阶
整形指针: int * pint;能够指向整形数据的指针。浮点型指针: float * pf;能够指向浮点型数据的指针。数组指针能够指向数组的指针int a = 10;//整型指针 - 是指向整形的指针 char ch = 'w';//字符指着 - 是指向字符的指针 //数组指针是一种指针 - 是指向数组的指针 double * d [ 5 ];//pd就是一个数组指针 int arr [ 10 ] = {原创 2023-05-01 08:40:48 · 1504 阅读 · 23 评论 -
C语言—深度剖析数据在内存中的存储
char //字符数据类型 short //短整型 int //整形 long //长整型 long long //更长的整形 float //单精度浮点型 double //双精度浮点型1.使用这个类型开辟内存空间的大小(大小决定了使用的范围)2.如何看待内存空间的视角实例一:不管是整数里面的正整数还是负整数,发现在当前编译器底下,这些补码都是倒着存储的大小端定义:大端(存储)模式(大端字节序),是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中。原创 2023-04-22 11:47:14 · 1122 阅读 · 32 评论 -
C语言—实用调试技巧
switch case语句中:case本身是用来判定的、break用来进行分支功能 任何具有判定功能的语法结构,都必须具备:判定+分支[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cArUKBwZ-1628348684153)(C:\Users\hp\AppData\Roaming\Typora\typora-user-images\1627726635270.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JvHVBM..原创 2023-04-14 16:29:08 · 1947 阅读 · 28 评论 -
C语言—结构体
深度剖析数据在内存中的存储(二)本章重点浮点型在内存中的存储解析本章重点浮点型在内存中的存储解析原创 2023-04-07 13:44:03 · 920 阅读 · 29 评论 -
C语言—指针
指针本节重点1. 指针是什么2. 指针和指针类型3. 野指针4. 指针运算5. 指针和数组6. 二级指针7. 指针数组指针是什么指针和指针类型前言指针类型的意义三级目录本节重点1. 指针是什么2. 指针和指针类型3. 野指针4. 指针运算5. 指针和数组6. 二级指针7. 指针数组指针是什么在计算机科学中,指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思原创 2023-04-06 15:45:27 · 656 阅读 · 14 评论 -
C语言—操作符和表达式
分类:算术操作符的使用:注:直接写出的小数,编译器会默认认为是double类型的数注:%和/是不支持被零除或被零求模的总结:左移操作符 移位规则:左边抛弃、右边补0注:左移操作符左边抛弃、右边补0(包括符号位,移动到符号位是什么就是什么)右移操作符 移位规则:首先右移运算分两种:可以看出在VS编译器下采用的是算术右移注意:例如:补充:按位与操作符的使用:按位或操作符的使用:按位异或操作符的使用:注:不能创建临时变量(第三个变量),实现两个数的交换。版本一是有缺陷的,当两个数值过大时两数原创 2023-04-05 16:39:40 · 1338 阅读 · 15 评论 -
C语言—数组
补充:数组作为函数传参的时候,形参可以写成两种形式:数组形式、指针形式。数组传参(不论是一维数组还是二维数组)在参数部分、调用部分传参的时候,实参传的时候一定是数组名(数组传参),而传过去形参部分展示的时候可以写数组也可以写成指针,但本质上都是指针(因为数组传参的时候传过去的其实是数组首元素的地址)。原创 2023-04-02 10:36:06 · 1462 阅读 · 22 评论 -
C语言—函数
自定义函数和库函数一样,有函数名,返回值类型和函数参数。但是不一样的是这些都是程序员来设计。这给程序员一个很大的发挥空间。statement;//语句项 } ret_type 返回类型fun_name 函数名para1 函数参数 {statement;//语句项} 函数体自定义函数的创建及使用://函数定义 int get_max(int x , int y) //x,y为形参 {int z = 0;else z = y;return z;原创 2023-03-30 19:34:01 · 956 阅读 · 15 评论 -
C语言—初识C语言
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。原创 2023-03-18 18:26:03 · 1294 阅读 · 45 评论 -
数据结构(链表——双向链表的实现)
链表——双向链表的实现链表的概念及结构链表的分类带头双向循环链表的介绍(重点)双向链表的实现模型思路(独一份)双链表的各种方法实现创建结构体并创建结构体指针变量实现双向表初始化实现双向链表销毁实现双向链表打印实现双向链表在任意位置的前面进行插入实现双向链表的头插和尾插实现双向链表在任意位置进行删除实现双向链表的头删和尾删实现双向链表查找链表的概念及结构概念: 链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。结构:链表的分类实际中链表的原创 2021-08-05 11:03:56 · 1414 阅读 · 6 评论 -
程序环境和预处理(二)
程序环境和预处理(二)一、 预定义符号介绍预处理详解预定义符号例子:二、 预处理指令 #define#define#define 定义标识符(#define是定义符号的)在编译常出现的几个列子思考:#define 定义宏定义语法#define 替换规则#和###的使用##的使用带副作用的宏参数三、宏和函数的对比命名约定四、命令行定义五、预处理指令 #include文件包含本地文件包含库文件包含嵌套文件包含六、预处理指令 #undef作用:语法七、条件编译常见的条件编译指令:一、 预定义符号介绍预处理详解原创 2021-07-24 19:32:24 · 569 阅读 · 1 评论 -
动态内存分配(二)
动态内存分配(二)常见的动态内存错误对NULL指针的解引用操作对动态开辟空间的越界访问对非动态开辟内存使用free释放使用free释放一块动态开辟内存的一部分对同一块动态内存多次释放动态开辟内存忘记释放(内存泄漏)经典的笔试题C/C++程序的内存开辟柔性数组常见的动态内存错误对NULL指针的解引用操作eg:#include<stdio.h>int main(){ int* p = (int*)malloc(10000000000); int i = 0; for (i =原创 2021-07-21 14:09:11 · 568 阅读 · 2 评论 -
自定义类型:结构体,枚举,联合(二)
自定义类型:结构体,枚举,联合 【二】 本节重点结构体结构体内存对齐修改默认对齐数结构体传参结构体实现位段(位段的填充&可移植性)枚举枚举类型的定义及使用枚举的优点本节重点结构体结构体内存对齐引例#include<stdio.h>struct S{ char c; int i; char c2;};int main(){ struct S s = { 0 }; printf("%d\n", sizeof(s)); return 0;}分析要点原创 2021-06-13 19:53:48 · 1198 阅读 · 5 评论 -
字符串函数和字符函数(二)
字符串函数和字符函数字符分类函数字符转换函数内存函数二级目录三级目录字符分类函数函数 如果他的参数符合下列条件就返回真iscntrl 任何控制字符isspace 空白字符:空格‘ ’,换页‘\f’,换行’\n’,回车‘\r’,制表符’\t’或者垂直制表符’\v’isdigit 十进制数字 0~9isxdigit 十六进制数字,包括所有十进制数字,小写字母af,大写字母AFislower 小写字母a~zisupper 大写字母A~Zisalpha 字母az或AZisalnum 字母或者数字原创 2021-06-13 13:28:40 · 1301 阅读 · 4 评论 -
【C语言从青铜到王者】初识指针
初识指针本章重点1.内存2.指针变量3.指针的使用指针变量的大小内存1.定义2.内存单元的地址解释内存是怎么编号的一个内存单元是多大空间指针变量指针的使用指针变量的大小本章重点1.内存2.指针变量3.指针的使用指针变量的大小内存1.定义内存是电脑上特别重要的存储器,计算机中所有程序的运行都是在内存中进行的 。所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。2.内存单元的地址为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该原创 2021-06-03 18:17:35 · 394 阅读 · 0 评论 -
深度剖析数据在内存中的存储(一)
深度剖析数据在内存中的存储(其一)本章重点数据类型详细介绍数据类型介绍类型的基本归类整形家族浮点数家族构造类型指针类型空类型整形在内存中的存储大小端介绍引例什么是大端小端练习练习本章重点1.整形在内存中的存储:原码、反码、补码2.大小端字节介绍及判断3.数据类型详细介绍数据类型详细介绍数据类型介绍基本的内置类型:char //字符数据类型short //短整型int //整形long //长整型long long //更长的整形float //单精度浮点型double原创 2021-05-23 12:52:20 · 1258 阅读 · 5 评论 -
C语言—扫雷
智力游戏:扫雷什么是扫雷扫雷的起源(以及扫雷的玩法)设计扫雷游戏的思路游戏要怎实现呢?!1.首先要打印一个菜单2.创建扫雷游戏3.游戏可以玩多次游戏的原码代码运行结果什么是扫雷《扫雷》是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。扫雷的起源(以及扫雷的玩法)扫雷最原始的版本可以追溯到1973年一款名为“方块”的游戏。不久,“方块”被改写成了游戏“Rlogic”。在“Rlogic”里,玩家的任务是作为原创 2021-05-06 22:25:55 · 643 阅读 · 9 评论 -
C语言—分支和循环语句
分支语句和循环语句前言重点什么是语句分支语句(选择结构)if语句悬空elseif 书写形式的对比练习switch语句在switch语句中的break编程好习惯default子句编程好习惯练习循环语句while循环while语句中的break和continuebreak介绍continue介绍while循环的应用前言我们一提到C语言,我们就经常讲:C语言是结构化的程序设计语言!一共有三种结构:1.顺序结构 2.选择结构 3.循环结构重点分支语句ifswitch循环语句whilefor原创 2021-05-03 13:10:36 · 503 阅读 · 5 评论 -
C语言—三子棋
什么是三子棋三子棋是黑白棋的一种。三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、井字棋等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时候会出现和棋的情况。游戏规则玩家每人选择一种棋子(#或*(也可以根据自己的喜好选择其他的)),先三个棋子连成一线的一方为胜方,横向、竖向、斜向均可。...原创 2021-04-25 19:49:05 · 570 阅读 · 7 评论 -
初识C语言(4)
数组定义:一组相同类型元素的集合。int arr[10]={1,2,3,4,5,6,7,8,9,10} //定义一个整型数组,最多放10个元素。当我们要存储1-10的数字时,我们就需要用到数组的概念。下面展示一些 代码。#include<stdio.h>int main(){ int i = 0; int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; for (i = 0;i < 10;i++) { printf("%d ", arr[原创 2021-04-22 20:04:59 · 248 阅读 · 1 评论 -
初识C语言(3)
初识C语言(2)构成C语言的四大基本语句有:顺序语句、循环语句、选择语句、条件语句。首先初步了解选择语句列题:如果你好好学习,校招时得到一个好offer,走向人生巅峰;如果你不学习你会失业,回家卖红薯下面展示一些 代码。#include<stdio.h>int main(){ int input = 0; //输入的值 printf("加入我们:>"); printf("那要好好学习吗(1/0)?>:"); scanf("%d", &input);原创 2021-04-21 21:20:23 · 270 阅读 · 3 评论