C语言
文章平均质量分 80
三分苦
hello world
展开
-
【C终章】函数栈帧的创建和销毁
目录一、本文目标二、基础知识 1、寄存器 2、代码案例 3、总体栈帧概况 4、所需反汇编代码总览三、函数栈帧创建销毁过程 1、_tmainCRTStartup函数(调用main函数)栈帧的创建 2、main函数栈帧的创建 3、main函数内执行有效代码(变量) 4、Add函数栈帧的创建5、Add函数内执行有效代码6、Add函数栈帧的销...原创 2022-03-07 12:34:34 · 2186 阅读 · 68 评论 -
【C进阶】预处理
目录一、预处理 (1)预定义符号 (2)define 2.1、#define 定义标识符 2.2、#define 定义宏 2.3、#define 替换规则 2.4、#和## 2.5、带副作用的宏参数 2.6、宏和函数对比 2.7、命名约定 (3)undef (4)命令行定...原创 2022-02-20 14:00:55 · 1983 阅读 · 102 评论 -
【C进阶】文件操作(2)
目录1、文件的随机读写(1)fseek(2)ftell(3)rewind2、文本文件和二进制文件3、文件读取结束的判定(1)被错误使用的feof4、文件缓冲区1、文件的随机读写(1)fseek创建一个文件test.txt,里面放了abcdef这样的字符串,我们先前在读文件时,最开始的文件指针是指向a的,读一个字符指向b,再读一个指向c……此时是按照顺序读取的,此时是文件的顺序读写。先来回顾下:#include<stdio.h>int main原创 2022-02-14 00:25:54 · 1418 阅读 · 72 评论 -
【C进阶】程序的环境
目录1、引言2、翻译环境 (一)编译 (1)预处理 (2)编译环节 (3)汇编 (二)链接3、运行环境1、引言在ANSI C的任何一种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。 第2种是执行环境,它用于实际执行代码比如说我们写了一个源文件test.c,其经过一个详细的处理后会变成test.exe文件,此篇文章会详细讲解test.c文件是如何到...原创 2022-02-17 13:13:57 · 1232 阅读 · 57 评论 -
C通讯录<文件版>
目录1、为什么改成文件版2、改动之处(1)保存信息到文件(2)将增容编写成函数(3)初始化里加载文件3、完整代码(1)test.c 文件(2)contact.h 文件(3)contact.c 文件1、为什么改成文件版我们之前写的通讯录运行起来的时候,可以给通讯录中增加、删除数据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了,等下次运行通讯录程序的时候,数据又得重新录入,如果使用这样的通讯录就很难受。而使用文件我们可以将数据直接存放在原创 2022-02-10 13:55:35 · 1829 阅读 · 59 评论 -
【C进阶】文件操作(1)
目录1、为什么使用文件2、什么是文件 (1)程序文件 (2)数据文件 (3)文件名3、文件的打开和关闭 (1)文件指针 (2)文件的打开和关闭4、文件的顺序读写 (一)fgetc和fputc fgets和fputs fscanf和fprintf fread和fwrite (二)对比一组函数1、为什么使用文件使用文件我们可以将数据...原创 2022-02-12 12:57:10 · 1714 阅读 · 60 评论 -
C通讯录<动态版>
目录1、动态版需求2、不同于静态版之处 (1)创建通讯录 (2)初始化通讯录 (3)增加联系人信息 (4)退出通讯录3、完整代码 (1)test.c 文件 (2)contact.h 文件 (3)contact.c 文件1、动态版需求假设通讯录初始化后,能存放3个人的信息 当我们空间存放满的时候,我们增加2个信息 以此类推每次不够就增加2个,例如3+2+2+2+……2、不同于静态版之处(1)创建通讯录...原创 2022-02-07 20:13:22 · 2138 阅读 · 56 评论 -
C通讯录<静态版>
目录1、基本要求2、通讯录各功能分析 (1)菜单实现 (2)初始化功能 (3)添加联系人并打印 (4)删除指定联系人 (5)查找指定联系人并打印 (6)修改指定人信息 (7)打印全部信息 (8)排序通讯录信息3、整体代码原创 2022-02-05 22:12:00 · 3559 阅读 · 45 评论 -
【C进阶】动态内存管理(2)
目录1、经典笔试题 试题1 试题2 试题3 试题42、C/C++程序的内存开辟3、柔性数组 3.1、柔性数组的特点 3.2、柔性数组的使用 3.3、柔性数组的优势1、经典笔试题试题1void GetMemory(char* p){ p = (char*)malloc(100);}void Test(void){ char* str = NULL; GetMemor...原创 2022-02-01 17:30:57 · 2373 阅读 · 46 评论 -
【C进阶】动态内存管理(1)
目录1、为什么存在动态内存分配2、动态内存函数介绍 2.1、malloc和free 2.2、calloc 2.3、realloc3、常见的动态内存错误 3.1、对NULL指针的解引用操作 3.2、对动态开辟空间的越界访问 3.3、对非动态开辟内存使用free释放 3.4、使用free释放一块动态开辟内存的一部分 3.5、对同一块动态内存多次释放 3.6、动态开辟内存忘记释...原创 2022-01-29 18:01:33 · 1164 阅读 · 54 评论 -
【C进阶】自定义类型(2)位段 - 枚举 - 联合
目录1、位段 1.1、什么是位段 1.2、位段的内存分配 1.3、位段的跨平台问题 1.4、位段的应用2、枚举 2.1、枚举类型的定义 2.2、枚举的优点 2.3、枚举的使用3、联合 3.1、联合类型的定义 3.2、联合的特点 3.3、联合大小的计算1、位段1.1、什么是位段位段的声明和结构是类似的,有两个不同:位段的成员必须是 int、un...原创 2022-01-26 21:03:16 · 1352 阅读 · 63 评论 -
【C进阶】自定义类型(1)结构体
目录1、结构体的基础知识2、结构体的声明3、特殊的声明4、结构体的自引用5、结构体变量的定义和初始化6、结构体内存对齐 练习1 练习2 练习3 练习4-结构体嵌套问题7、修改默认对齐数8、结构体传参1、结构体的基础知识结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。2、结构体的声明基本语法://struct:结构体的关键字struct tag //tag:结构体标签{...原创 2022-01-24 23:18:42 · 448 阅读 · 60 评论 -
【C进阶】字符函数&字符串函数
目录1、strlen 1.1、三种模拟实现2、长度不受限制的字符串函数 2.1、strcpy 2.1.1、模拟实现 2.2、strcat 2.2.1、模拟实现 2.3、strcmp 2.3.1、模拟实现3、长度受限制的字符串函数 3.1、strncpy 3.1.1、模拟实现 3.2、str...原创 2022-01-23 16:23:18 · 1983 阅读 · 48 评论 -
<笔试题>指针
目录1、笔试题1:2、笔试题2:3、笔试题3:4、笔试题4:5、笔试题5:6、笔试题6:7、笔试题7:8、笔试题8:原创 2022-01-20 16:50:40 · 1880 阅读 · 55 评论 -
<笔试题>指针和数组
目录1、一维数组 1.1、整型数组 1.2、字符数组2、二维数组1、一维数组 1.1、整型数组先对数组名有个简要认知: 数组名是首元素地址,但是有两个例外sizeof(数组名) - 数组名表示整个数组,计算的是整个数组的大小,单位是字节 &数组名 - 数组名表示整个数组,取出的是数组的地址 除上面两种特殊情况外,所有的数组名表示数组首元素地址再对sizeof和strlen有个简要认知: strlen: ...原创 2022-01-19 01:12:30 · 1031 阅读 · 50 评论 -
【C进阶】* 指针(2)
目录1、函数指针1.2、两段有趣代码2、函数指针数组2.2、用途(转移表)->计算器3、指向函数指针数组的指针4、回调函数4.1、回顾冒泡排序4.2、使用qsort函数4.3、使用回调函数,模拟实现qsort(采用冒泡的方式)1、函数指针简要概念:既然数组指针是指向数组的指针,那么函数指针就是指向函数的指针,用来存放函数地址的一个指针。 我们先写一个加法函数,并且打印出其地址看看。...原创 2022-01-15 11:22:21 · 2392 阅读 · 74 评论 -
【C进阶】* 指针(1)
目录1. 字符指针2. 指针数组3. 数组指针 3.1、数组指针的定义 3.2、&数组名VS数组名 3.3、数组指针的使用4. 数组参数、指针参数 4.1、一维数组传参 4.2、二维数组传参 4.3、一级指针传参 4.4、二级指针传参1. 字符指针在指针的类型中我们知道有一种指针类型为字符指针 char* ;一般使用:int main(){ ch...原创 2022-01-14 01:41:18 · 517 阅读 · 41 评论 -
C深剖 “优先级”
目录一、 优先级表二、 易错优先级一、优先级表二、易错优先级原创 2022-01-13 15:43:33 · 229 阅读 · 28 评论 -
C深剖 “取模取整”
目录一:四大取整1.1、 0向取整1.2、 地板取整(-∞取整)1.3、 +∞取整1.4、 四舍五入取整1.5、 例子汇总二:取模 / 取余2.1、 概念2.2、 示例(C和Python)2.3、 取余和取模一样吗?2.4、 计算数据同符号2.5、 计算数据不同符号2.6、 总结...原创 2022-01-10 16:49:41 · 5059 阅读 · 45 评论 -
C深剖关键字(5)
目录一:union关键字二:enum关键字三:typedef关键字一:union关键字联合关键字:联合体内部共享空间,整个union的大小由内部最大的元素决定。#include<stdio.h>union un{ int a; char b; // a和b共用一个空间,不过空间总大小由a决定};int main(){ // a和b共用一个空间,不过空间总大小由a决定 printf("%d\n", sizeof(union un)); // 4 re原创 2022-01-02 23:12:56 · 2213 阅读 · 54 评论 -
C深剖关键字(4)
目录一:volatile关键字二:extern关键字三:struct关键字一:volatile关键字volatile关键字和const一样是一种类型修饰符,用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统,硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。举个例子:此例没有volatile,就说明是可优化的#include<stdio.h>int pass = 1;int原创 2022-01-02 02:14:03 · 443 阅读 · 21 评论 -
C深剖关键字(3)
目录一:void关键字二:return关键字三:const关键字一:void关键字问题:void能否定义变量?从图中不难发现,void定义x出错,可原因是什么呢?定义变量的本质:开辟空间而void作为空类型,理论上是不应该开辟空间的,即使开了空间,也仅仅作为一个占位符看待所以,既然无法开辟空间,那么也就无法作为正常变量使用,既然无法使用,编译器干脆不让他定义变量。void的大小在不同编译器下是不一样的在vs2013中,sizeof(void)=0在Li.原创 2022-01-01 15:17:22 · 706 阅读 · 19 评论 -
C深剖关键字(2)
目录一:signed / unsigned关键字二:switch关键字三:break / continue关键字四:goto关键字一:signed / unsigned关键字在正式了解signed / unsigned关键字之前,我们需要对数据在所开辟内存中到底是如何存储进行一个深入了解。首先就要了解:整数的二进制表示有3种表示形式:原码----反码----补码而内存存储的是二进制的补码!整数:正数 / 负数正数:原码反码补码相同负数:原码:按照一个数的...原创 2022-01-01 00:00:00 · 1702 阅读 · 16 评论 -
C深剖关键字(1)
目录一:auto 1.1 局部变量与全局变量 1.2 auto相关二:register三:static四:sizeof一:auto 1.1 局部变量与全局变量局部变量与全局变量定义:局部变量:包含在代码块中的变量叫做局部变量。局部变量具有临时性。进入代码块,自动形成局部变量,退出代码块自动 释放。[网上很多说函数中的变量是局部变量,不能说错,但说法是不准确的]全局变量:在所有函数外定义的变量,叫做全局变量。全局变量具有全局...原创 2021-12-31 14:03:22 · 599 阅读 · 22 评论 -
C语言数据类型与“0值”的比较
目录1.bool变量与“0值”进行比较 1.1 bool类型介绍 1.2 bool和0比较2.浮点数与“0值”进行比较 2.1 浮点数之间的比较 2.2 浮点数和0比较3.指针变量和“0值”的比较 3.1 引言 3.2 指针和0比较1.bool变量...原创 2021-12-18 22:01:14 · 1818 阅读 · 46 评论 -
C语言深入了解qsort函数
目录例题引入: 法一:冒泡排序 法二:使用qsort函数例题引入:问题描述:期中考试开始了,大家都想取得好成绩,争夺前五名。从键盘输入 n 个学生成绩,输出每组排在前五高的成绩。(数据范围:5<=n<=50,成绩采取百分制并不会出现负数)输入描述:两行,第一行输入一个整数,表示n个学生(>=5),第二行输入n个学生成绩(整数表示,范围0~100),用空格分隔。输出描述:一行,输出成绩最高的前五个,...原创 2021-12-11 23:56:43 · 1690 阅读 · 23 评论 -
C语言初阶练习6.0
目录1. 喝汽水问题2.调整奇数偶数顺序3.杨辉三角4.猜凶手5.猜名次1. 喝汽水问题//喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水// 法一:正常解法#include<stdio.h>int main(){ int money = 0; int total = 0; scanf("%d", &money); int empty = 0; total += money; empty += money...原创 2021-12-02 00:20:06 · 2485 阅读 · 32 评论 -
C语言初阶练习5.0
目录1. 判断整数奇偶性2. 判断是元音还是辅音3. 使用指针打印数组的内容4. 计算求和5. 打印水仙花数6. 打印菱形1. 判断整数奇偶性#include<stdio.h>int main(){ int n = 0; while ((scanf("%d", &n)) != EOF) { if (n % 2 == 1) { printf("Odd\n"); } else { printf("Even\n");原创 2021-12-02 00:00:27 · 1325 阅读 · 19 评论 -
C语言整型在内存中的存储(练习)
目录1.2.3.4.5.6.7.1.#include<stdio.h>int main(){ char a = -1; signed char b = -1; unsigned char c = -1; printf("a=%d,b=%d,c=%d", a, b, c); // a=-1,b=-1,c=255 return 0;}//解析:-1占4个字节,而char类型大小是1个字节,所以这时要发生截断100000000...原创 2021-11-29 13:04:40 · 1038 阅读 · 25 评论 -
C语言数据的存储
目录1.数据类型详细介绍: 1.1 类型的基本归类2. 整形在内存中的存储 2.1 原码,反码,补码 2.2 大小端介绍3. 浮点型在内存中的存储 3.1 例题 3.2 浮点数存储规则1.数据类型详细介绍:前面我们已经学习了基本的内置类型:以及他们所占存储空间的大小:char:1字节 short:2字节 int、long、float均4字节 double、long long均8字节当然还有一种数据类型,平...原创 2021-11-28 00:37:20 · 840 阅读 · 30 评论 -
C语言结构体详解
目录1. 结构体类型的声明2. 结构体初始化3. 结构体成员访问4. 结构体传参1. 结构体类型的声明结构体的基础知识:结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。生活中的对象都是复杂的!人:名字+性别+年龄+电话+……书:书名+作者+出版社+定价……结构体就是用来描述复杂对象的结构的成员可以是标量、数组、指针,甚至是其他结构体。基本格式:struct tag{ member-list;}variable-li原创 2021-11-27 19:22:08 · 685 阅读 · 19 评论 -
C语言初阶指针详解
目录1. 指针是什么2. 指针和指针类型3. 野指针4. 指针运算5. 指针和数组6. 二级指针7. 指针数组1. 指针是什么指针理解的2个要点:1. 指针是内存中一个最小单元的编号,也就是地址2. 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量总结:指针就是地址,口语中说的指针通常指的是指针变量。#include<stdio.h>int main(){ int a = 10; int* pa = &a; .原创 2021-11-22 23:51:31 · 634 阅读 · 18 评论 -
C语言初阶练习4.0
目录1. 冒泡排序2.创建一个整形数组,完成对数组的操作3.将数组A中的内容和数组B中的内容进行交换。(数组一样大)4. 求两个数二进制中不同位的个数5. 打印整数二进制的奇数位和偶数位6. 统计二进制1的个数7. 交换两个变量(不创建临时变量)1. 冒泡排序冒泡排序的思想:两两相邻的元素进行比较,如果有可能的话需要交换。一趟冒泡排序能搞定一个数字,让当前待排序的数组中一个元素来到最终应该出现的位置上目的:将一系列数字按照一定规律排序,如从小到大排列:...原创 2021-11-22 19:36:32 · 1013 阅读 · 14 评论 -
表达式求值
目录1:隐式类型转换2:算术转换3:操作符的属性1:隐式类型转换C的整型算术运算总是至少以缺省整型类型的精度来进行的。 为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。上代码:#include<stdio.h>int main(){ char a = 5; // 截断 // 00000000000000000000000000000101 5的二进制 32个bit位 // 00000101 截断原创 2021-11-22 00:33:33 · 575 阅读 · 14 评论 -
操作符详解
目录1. 算数操作符2. 移位操作符 2.1 右移操作符 2.2 左移操作符3. 位操作符4. 赋值操作符5. 单目操作符6. 关系操作符7. 逻辑操作符8. 条件操作符9. 逗号表达式10.下标引用、函数调用和结构成员1. 算数操作符如:+ - * / %这里着重讲解下 / 和 % 操作符,上代码:#include<stdio.h>int m...原创 2021-11-22 00:14:44 · 847 阅读 · 14 评论 -
关机小程序
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<string.h>int main(){ char input[20] = { 0 }; system("shutdown -s -t 120");//system() - 库函数-执行系统命令again: printf("请注意,你的电脑在二分钟内关机,如果输入:我是猪,就取消关机\n"); sc.原创 2021-11-20 23:35:36 · 686 阅读 · 13 评论 -
C语言初阶练习3.0
目录1.实现一个函数来交换两个整数的内容。2.编写代码,演示多个字符从两端移动,向中间汇聚。3.编写代码实现,模拟用户登录情景,并且只能登录三次。4. 字符串逆序5.计算一个数的每位之和(递归实现)6. 递归实现n的k次方1.实现一个函数来交换两个整数的内容。#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>void swap(int* a, int* b){ int z = 0; z = *...原创 2021-11-20 23:09:33 · 686 阅读 · 14 评论 -
猜数字小游戏
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<time.h>void menu(){ printf("*******************************************\n"); printf("********* 1.play ***********\n"); printf("********* .原创 2021-11-18 01:19:04 · 3511 阅读 · 15 评论 -
C语言初阶练习2.0
目录1. 编写程序数一下 1到 100 的所有整数中出现多少个数字92.计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果3.求10 个整数中最大值4.在屏幕上输出9*9乘法口诀表5.二分查找1. 编写程序数一下 1到 100 的所有整数中出现多少个数字9#include<stdio.h>int main(){ int i = 0; int count = 0; for (i = 1; i <= ...原创 2021-11-18 01:15:12 · 622 阅读 · 15 评论 -
C语言初阶练习1.0
目录1.写代码将三个整数数按从大到小输出。2.写一个代码打印1-100之间所有3的倍数的数字3.给定两个数,求这两个数的最大公约数4.打印1000年到2000年之间的闰年5.打印100~200之间的素数1.写代码将三个整数数按从大到小输出。#include<stdio.h>int main(){ int a = 0; int b = 0; int c = 0; int tmp = 0; //输入 scanf("%d %d %d", &a, &原创 2021-11-18 00:47:56 · 518 阅读 · 14 评论