C语言
文章平均质量分 70
绅士·永
不忘初心
展开
-
探究栈帧的奥妙
在我们进行函数调用的时候,编译器都会在栈区为这个函数维护一个栈帧,即每一个函数对应着一个栈帧,这是概念,那么我们通俗的来讲讲什么事栈帧。首先明确一点,我们在进行变量创建的时候,编译器是给这个变量分配了对应的虚拟内存的,即创建变量时,需要一定的开销,而这个开销一部分就是体现在内存占用上,那么回到函数调用这里来,和创建变量类似,函数也是一个类型,在进行调用的时候同样也需要一定的内存开销,这个函数占用的内存空间就是这个函数的栈帧,即栈帧=占用内存。原创 2023-10-30 13:20:58 · 175 阅读 · 0 评论 -
【C语言】宏实现offsetof
目录一、offsetof的用法二、宏实现三、测试代码一、offsetof的用法用法:用于计算某结构体中的成员偏移量#include <stdio.h>struct Stu{ int a; // 偏移量0 char b;// 偏移量4 int c;// 偏移量8};int main(){ printf("%d\n", offsetof(struct Stu, c)); // 打印成员c的偏移量8 return 0;}二、宏.原创 2022-04-17 19:26:33 · 1103 阅读 · 0 评论 -
【C语言】预处理详解
文章目录一、预定义符号二、#define定义2.1.#define定义标识符2.2.#define定义宏2.3.#define替换规则2.4.#和##(1)#号可以将宏中的参数转化为对应字符串(2)## 把位于符号两边的符号合成一个符号2.5.带副作用的宏参数2.6.宏和函数对比2.7.命名约定三、#undef四、命令行定义五、条件编译六、文件包含6.1.头文件被包含的方式6.2.嵌套头文件包含一、预定义符号__ FILE__ //进行编译的源文件__ LINE__ //文件当前的原创 2022-04-12 17:11:07 · 1243 阅读 · 9 评论 -
【C语言】程序的翻译环境和执行环境
一、程序的翻译环境和执行环境在ANSI C的任何一种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。第2种是执行环境,它用于实际执行代码。什么是翻译环境将test.c源文件 -> test.exe 的过程所依赖的环境就是翻译环境,这个test.exe是二进制的文件,计算机可以直接运行的文件。一般来说翻译环境就是(编译器)我们平时用的编译器列如vs2019等,是高度集成了的开发环境-IDE什么是执行环境执行test.exe文件所依赖的环原创 2022-04-10 20:10:35 · 1112 阅读 · 1 评论 -
【C语言】文件操作详解
文章目录一、为什么使用文件二、什么是文件2.1程序文件2.2数据文件2.3文件名三、文件的打开和关闭3.1文件指针3.2文件的打开和关闭3.3fopen函数 和 fclose函数四、文件的顺序读写4.1一组函数对比4.2什么是流五、文件的随机读写5.1 fseek5.2 ftell5.3 rewind六、 文本文件和二进制文件七、文件读取结束的判定7.1被错误使用的feof八、文件缓冲区一、为什么使用文件在某些情况下,比如通讯录的实现,在输入联系人的信息后还需要保存其数据,但我们编写的程序在运行结束后原创 2022-04-08 18:40:55 · 430 阅读 · 13 评论 -
KMP算法
KMP算法详解一、什么是KMP算法二、next数组的求法三、C语言代码实现(1)找子串的函数(2)创建next数组的函数四、next数组优化nextval(1)next数组的不足(2)nextval的优化一、什么是KMP算法我们在模拟strstr函数时,有两种方法(1)BF暴力算法(2)KMP算法在BF算法中,每一次的不匹配都会让子串回到初始位置,主串回到前一个匹配字符的下一个字符,开始匹配。那么KMP算法是一种尽量减少主串和子串的的匹配次数的改进的算法。时间复杂度O( m + n)原创 2022-04-01 19:20:34 · 1831 阅读 · 19 评论 -
动态内存函数
一、为什么需要动态开辟内存?我们平时在创建空间时通常都是通过创建数组来实现的,而数组在创建时是必须指定空间的。但是在编写程序的时候,对于一些实际问题来说,其内容是不确定的,我们需要在编写过程中才能知道需要多少空间。这时就需要动态开辟内存来实现了。二、动态内存函数(1).malloc函数原型:void* (size_t)作用:向内存申请一块连续可用的空间。如果开辟成功,返回开辟空间的起始地址 如果开辟失败,返回NULL 如果参数为0,这是标准未定义的,由编译器决定结果原创 2022-03-30 21:49:41 · 788 阅读 · 11 评论 -
【C语言】自定义类型详解:结构体、枚举、联合体
目录一、结构体详解1、结构体类型的声明1.1.结构体是什么?1.2.结构体声明1.3.特殊的结构体声明(匿名结构体)2、结构体的自引用3、结构体变量的定义和初始化4、结构体的内存对齐内存对齐的规则是什么呢?列1:列2:列3:列4.内嵌结构体:宏offsetof#pragram pack()为什么会出现内存对齐?5、结构体传参6、结构体实现位段(填充&移植)1.什么是位段?2.位段的内存分配3.位段跨平台的具体问.原创 2022-03-25 21:13:55 · 1776 阅读 · 9 评论 -
指针笔试题详解(会了你就可以轻松玩转指针)
目录一、第一阶段一、笔试题1二、笔试题2三、笔试题3四、笔试题4五、笔试题5二、第二阶段一、笔试题1二、笔试题2三、笔试题3相关图解:四、笔试题4五、笔试题5相关图解:六、笔试题6七、笔试题7八、笔试题8相关图解:一、第一阶段一、笔试题1首先需要清楚数组名表示什么?一般情况下数组名表示数组首元素地址两个特殊情况:数组名单独放在sizeof内部,&数组名,这两种情况表示的是整个数组。void te原创 2022-03-20 14:19:37 · 594 阅读 · 12 评论 -
(C语言)求最大公约数的四个方法
一、穷举法二、辗转相除法三、更相减损术四、Stein算法(结合辗转相除法和更相减损法的优势以及移位运算)原创 2022-03-17 13:18:43 · 47301 阅读 · 10 评论 -
qsort库函数详解
目录一、qsort是什么?二、qsort的功能?三、qosrt函数详解1.qsort函数的定义2.qsort函数的传参四、qsort的模拟实现(冒泡)1.如何实现交换?2.如何实现字节之间的交换一、qsort是什么?qsort是C语言库函数里面的一种,包含于#include <stdlib.h>这个头文件里面。二、qsort的功能?qsort英语解析:Quick sort,翻译就是快速排序,它的内部实现是通过的快速排序算法来实现的。原创 2022-03-14 20:06:29 · 7099 阅读 · 9 评论 -
指针进阶超详解
一、 字符指针二、数组指针三、指针数组四、 数组传参和指针传参五、函数指针六、函数指针数组七、指向函数指针数组的指针八、回调函数九、指针和数组面试题的解析原创 2022-03-13 12:17:21 · 1037 阅读 · 17 评论 -
static关键字
一、为什么会有static关键字?1、有关多文件中的声明文件.h为什么会诞生.h头文件?在用C语言写大型项目时,一定会同时创建许多个源文件来共同实现整个项目,但我们知道不同源文件中定义的全局变量,在其他文件里面是不能使用的,需要先使用extern关键字进行变量的声明才能使用,但是这些大量的源文件之间的“互交”可以说是大量的,频繁的,那么我们就需要在每一个源文件中都声明一遍吗?而且“互交”使用的全局变量可能是非常多的,这无疑是增加了代码的编写效率,降低了代码的维护性。为了解决这种声明问题,就原创 2022-03-09 21:24:59 · 328 阅读 · 6 评论 -
隐式类型转换
目录一、什么是隐式类型转换?二、为什么会有隐式类型转换?三、怎么隐式类型转换?一、什么是隐式类型转换?我们直接观察不到的类型转换,这就是隐式类型转换。二、为什么会有隐式类型转换?对于计算机来说,只有加法运算,其余的运算都是通过加法来实现的,并且计算过程都是在CUP上进行的,而CUP运算器一般都是8字节的长度,也就是int类型的长度,就只能处理8字节的加法运算,所以在处理数据时通常会发生整型提升。三、怎么隐式类型转换?整型提升:按照变量的符号位进行提升原创 2022-03-09 13:35:40 · 4969 阅读 · 1 评论 -
浮点数的储存方式
目录一、浮点数类型二、浮点数的国际标准三、浮点数的储存方式1.那么这个国际标准是什么意思呢?2.关于M位和E位的特殊规定3.浮点数无穷小和无穷大的概念一、浮点数类型浮点数类型 字节长度 float 4 double 8 二、浮点数的国际标准根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式: (-1)^S * M * 2^E,其中 (-1)^s表示符号位,当s=0,V为正数;当s=1,原创 2022-03-05 10:42:08 · 1115 阅读 · 10 评论 -
(猜名次)guess the rank
一、题目5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:A选手说:B第二,我第三;B选手说:我第二,E第四;C选手说:我第一,D第二;D选手说:C最后,我第三;E选手说:我第四,A第一;比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。二、思路其实并没有太大的技巧,因为题目给了条件,所以按照条件编写程序即可,我们需要将所有的情况都列举出来,然后进行判断#include <stdio.h>//A选手说:B第二,我第三;//B选手说原创 2022-02-25 22:00:25 · 693 阅读 · 0 评论 -
扫雷(递归实现版)-新年快乐
目录思路清晰的逻辑。菜单棋盘两个棋盘初始化布置雷排雷判断输赢text.c实现game.c实现game.h实现递归部分详解 思路 清晰的逻辑。 为方便将其分为三个文件:text.c(测试) game.c(函数实现) game.h(头文件声明)在排雷的时候为了方便,我们需要将每一行每一列对应的行数,列数打印出来。#define LEI 10#define ROW 10#define LOW 10#define RO..原创 2022-01-23 11:31:14 · 3018 阅读 · 10 评论 -
C语言实现三子棋
目录文件的分割创建text.c部分game.c部分输赢的判断game.h部分 文件的分割创建 text.c(游戏的测试)game.c(游戏的功能实现)game.h(函数的声明)创建这三个文件以分工实现三子棋的功能 text.c部分 主要使用自定义的函数将游戏的整个的运行流程编写出来,首先游戏需要一个选择的菜单menu(),其次需要一个选择的输入,因为需要先运行一次打印菜单故采用do while,然后才是game()函数的实现。game()中,首先需要二维原创 2022-01-22 12:25:11 · 2477 阅读 · 10 评论 -
字符函数&字符串函数&内存函数
一、字符&字符串函数strlen--求字符串长度 释:是所求‘\0’之前的字符个数。库函数类型-size_t(const char*) size_t == unsigned int#include <string.h>int main(){ ch...原创 2022-01-09 18:52:30 · 694 阅读 · 19 评论 -
C语言-数据储存(详解)
数值在计算机中都是以补码的形式进行储存的。C语言中的数据类型有以下种类一、分类这些数据类型大致可以分为两类:1、整型。2、浮点型。整型 浮点型 int float short double long long long char C语言中所有数据都是以二进制的方式储存的,字符也是,对于char里的字符型数据在进行加减运算时,是将其数据进行隐形转化为int型了的,对于其字符进行运算时,是将其字符转发为对应的ASCLL码后原创 2021-12-25 16:44:55 · 3302 阅读 · 5 评论 -
C语言-冒泡排序算法
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>void Compare(int arr[], int len){ int n = 0, m = 0; int temp = 0; int lent = 0;//减少后面比较排序的无效次数 for (m = 0; m < len - 1; m++) { lent = len; lent--;//优化排序速度,减少重复排序 for (n = 0; n &.原创 2021-12-18 15:56:55 · 885 阅读 · 0 评论 -
C语言-快速排序算法(递归Hoare版)
废话不多说,先看代码#define _CRT_SECURE_NO_WARNINGS 1//快速排序算法,递归求解#include <stdio.h>void swap(int* a, int* b){ int c = 0; c = *a; *a = *b; *b = c;}void Compare(int arr[], int one, int end){ int first = one;//最左边数组下标 int last = end;//最右边数组下标 i原创 2021-12-18 16:58:52 · 2074 阅读 · 6 评论 -
C语言-直接插入排序算法
直接 插入排序 (Straight Insertion Sort)是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。.废话不多说先看看代码#define _CRT_SECURE_NO_WARNINGS 1//直接插入排序法#include <stdio.h>void Compare(int arr[], int len){ int i = 0; for (i = 0; i < len-1; i++)//l原创 2021-12-20 21:41:59 · 5606 阅读 · 8 评论 -
C语言-快速排序算法(挖坑法)
全部代码如下#include <stdio.h>void evaluation(int *x,int b)//赋值函数{ *x = b;}void Compare(int arr[],int first,int last){ int one = first;//数列第一个元素下标 int end = last;//数列最后一个元素下标 int key = arr[one];//创建一个坑 //判断是否为一个元素 if (one >= end)//函数结束条件原创 2021-12-23 18:29:34 · 769 阅读 · 11 评论