![](https://img-blog.csdnimg.cn/20190918140129601.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
c语言
文章平均质量分 71
来学c语言吧
2023框框
这个作者很懒,什么都没留下…
展开
-
栈帧的创建与销毁干货!
esp 栈顶指针ebp栈低指针2.main函数也是被人调的main函数下还有其他函数调用main函数调用main函数后再栈区开辟空间,再调用add函数再栈区开辟空间,在学期的过程中,我们可能有很多困惑?比如:局部变量是怎么创建的?为什么局部变量的值是随机值?函数是怎么传参的?传参的顺序是怎样的?形参和实参是什么关系?函数调用是怎么做的?函数调用结束后是怎么返回的?当看完这篇文章,学习了函数栈帧的创建与销毁后,上面的问题,自然水落石出,对于接下..原创 2021-08-15 15:56:26 · 290 阅读 · 0 评论 -
模拟实现qsort函数
知识储备1.冒泡排序void bubble_sort(int arr[], int sz)//1 这个冒泡函数写死了,只能够对整型数组排序,如果是浮点型之类就不行了 { for (int i = 0; i < sz - 1; i++) { for (int j = 0; j < sz - 1 - i; j++) { if (arr[j] > arr[j + 1]) { int tmp = 0; tmp = arr[j]; arr[j]原创 2021-09-02 16:09:30 · 103 阅读 · 0 评论 -
指针和数组笔试题解析
为什么数组名单独放在sizeof里是计算整个数组的大小?只要把数组名认清知道数组指针是干什么的,它是用来指向一个数组的嘛,对不对?所以你当对这个数组指针进行节用的事儿,其实相当于找到了这个数组,那谁能代表这个数组的数组名吧。看完下面的练习题我们可以很清楚的知道数组名是什么,这是一个非常重要的底层逻辑,只有把这个搞清楚,我们做题的时候才能做的得心应手sizeof -操作符 - 单位是字节 ,返回类型size_t求变量所占空间大小求类型创建的变量所占空间的大小数组名:1.sizeof(数组名原创 2021-09-07 22:08:20 · 168 阅读 · 1 评论 -
常见的字符串操作函数详解
文章目录字符串操作函数实现详解一、模拟实现strlen函数1.strlen原型2.strlen功能3.strlen 实现的方法和思路A.暴力求解B.递归方法C.指针—指针二、模拟实现strcpy()1.函数原型2.函数的功能3.strcpy的实现4. strncpy的实现三、strcat()函数1.函数声明原型2. 函数功能3.strcat的实现4.strncat四、Strcmp1.strcmp的原型2. 函数的功能3.strcmp的实现4.strncmp五、Strstr1.函数原型2.函数的功能:3.函数原创 2021-09-17 16:36:46 · 1166 阅读 · 0 评论 -
小项目实现通讯录练习
通讯录1.存放1000个人的信息信息:名字+性别+年龄+电话+住址(复杂对象创建结构体)2.增加联系人3.删除联系人4.修改5.查找6.排序7.存到文件里1.test.c#define _CRT_SECURE_NO_WARNINGS 1#include"contact.h"void meun(){ printf("*******************************\n"); printf("*******1.add 2.del *******\n")原创 2021-09-20 14:38:52 · 269 阅读 · 0 评论 -
结构体,枚举,联合,
结构体1.结构体对其问题点 如何计算? 首先得掌握结构体的对齐规则:\1. 第一个成员在与结构体变量偏移量为0的地址处。\2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。VS中默认的值为8Linux中的默认值为4\3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。\4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐原创 2021-09-20 14:36:31 · 75 阅读 · 0 评论 -
结构体,枚举,联合
结构体1.结构体对其问题点 如何计算? 首先得掌握结构体的对齐规则:\1. 第一个成员在与结构体变量偏移量为0的地址处。\2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。VS中默认的值为8Linux中的默认值为4\3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。\4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐原创 2021-09-20 15:41:22 · 99 阅读 · 0 评论 -
C语言——预处理(二)
文章目录#definedefine 定义标识符define中的续行符define 定义宏#define 替换规则#和##"#""##"带副作用的宏参数宏与函数对比宏与函数的命名约定预处理指令 #undef#definedefine 定义标识符#define M 100#define 定义M,相当于给M赋值了100,在预处理阶段会把M替换成100一下奇怪的标识符例子:#define MAX 1000#define reg register //为 register这个关键字,创建一个简短的原创 2021-10-03 11:59:23 · 573 阅读 · 0 评论 -
文件操作之错误使用feof(四)
文件结束的判定被错误使用的feofint feof( FILE *stream );功能:检查是否设置了与流关联的文件结束指示符,如果是,则返回一个不为零的值。牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。文本文件读取是否结束,判断返回值是否为EOF (fgetc),或者NULL(fgets)例如:fgetc判断是否为EOF.//读到末尾就返回EOFfgets判断返回值是否为NULL原创 2021-09-30 17:08:14 · 886 阅读 · 0 评论 -
文件操作
文章目录文件操作什么是文件?文件名问题文件类型文件缓冲区文件操作什么是文件?文件是计算机文件,属于文件的一种,与普通文件的载体不同,计算机文件是以计算机硬盘为载体存储在计算机上的信息集合。在程序设计中,我们一般关注的文件有两类,即程序文件和数据文件。程序文件: 包括源程序(以.c为后缀)和可执行程序(以.exe为后缀)。数据文件: 文件的内容不一定是程序,而是程序运行时读写的数据。比如程序运行时需要从中读取数据的文件,或者输出内容的文件。文件名一个文件要有一个唯一的文件标识,以便用户识别和引原创 2021-09-29 08:46:21 · 487 阅读 · 0 评论 -
文件的顺序读写(三)
文章目录文件的顺序读写字符输入输出函数fgetc、fputc问题fputssscanf sprintf文件的顺序读写前面我们学习了文件是如何打开和关闭,打开文件后我们应该要知道如何操作文件中的数据(输入或输出数据)。对文件数据的读写可以分为顺序读写和随机读写。顺序读写,即挨着顺序对文件中的数据进行输入或输出。下面内容我将要介绍顺序读写:功能函数名适用于字符输入函数fgetc所有输入流字符输出函数fputc所有输出流文本行输入函数fgets所有输入流原创 2021-09-30 11:18:43 · 947 阅读 · 1 评论 -
C语言动态内存管理及柔性数组满满干货
文章目录一、为什么存在内存分配1、数组的缺点:2.动态内存分配a.计算机系统中几个内存区域二、动态内存函数的1.malloc2.free3.问题4.calloc5. 问题6.realloc7.realloc 调整内存空间有两种情况8.常见的内存错误总结:一、为什么存在内存分配1、数组的缺点:开辟空间的大小被固定数组开辟多少空间不缺点,有时候要程序运行时才知道如果开辟太大空间就会造成空间浪费,并且不能通过手动释放空间在函数内创建的数组,在函数运行结束后才会把空间释放掉数组的长度不能在函数程序运原创 2021-09-24 17:52:01 · 190 阅读 · 3 评论 -
文件操作 * 基本概念(一)
文章目录文件操作什么是文件?文件名问题文件类型文件缓冲区问题文件指针(FILE)文件操作什么是文件?文件是计算机文件,属于文件的一种,与普通文件的载体不同,计算机文件是以计算机硬盘为载体存储在计算机上的信息集合。在程序设计中,我们一般关注的文件有两类,即程序文件和数据文件。程序文件: 包括源程序(以.c为后缀)和可执行程序(以.exe为后缀)。数据文件: 文件的内容不一定是程序,而是程序运行时读写的数据。比如程序运行时需要从中读取数据的文件,或者输出内容的文件。文件名一个文件要有一个唯一的文原创 2021-09-28 13:27:15 · 212 阅读 · 0 评论 -
c语言——预处理(一)
文章目录预定义符号预定义符号在C语言中,有一些有意思的预定义符号,这些预定义符号都是语言内置的,即以及定义好的,我们可以直接使用。预定义符号主要有以下几个:__FILE__ //进行编译的源文件__LINE__ //文件当前的行号__DATE__ //文件被编译的日期__TIME__ //文件被编译的时间__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义__FUNCTION__//当前所在的函数注:这些预定义符号是已经用#define定义好的,在代码运行后的预处理阶原创 2021-10-02 23:16:58 · 104 阅读 · 0 评论 -
c 语言——预处理(三)
文章目录命令行定义条件编译常见的条件编译的预处理指令嵌套条件编译预处理指令文件包含#include<>与#include""区别命令行定义许多C 的编译器提供了一种能力,允许在命令行中定义符号。用于启动编译过程。例如:当我们根据同一个源文件要编译出不同的一个程序的不同版本的时候,这个特性有点用处。(假定某个程序中声明了一个某个长度的数组,如果机器内存有限,我们需要一个很小的数组,但是另外一个机器内存大写,我们需要一个数组能够大写。)在gcc进行编译#include <stdi原创 2021-10-03 14:07:03 · 153 阅读 · 0 评论 -
C语言文件操作(三)随机读写
文章目录随机读写前面fseek函数ftellrewind函数随机读写前面顺序读写,输入和输出只能按顺序读写,这样非常的笨拙,为了能更好的操作文件,出现另一种文件操作函数,使得我们再文件中随机读取。随机读写并非胡乱读写,而是按照操作人的意愿,读写文件的某一位置。为了方便理解直接上代码:例如我们现在要读取文件三个字符;int main(){ //打开文件 FILE* pf = fopen("data.txt", "rb"); if (pf == NULL) { printf("%s\原创 2021-09-30 15:00:10 · 809 阅读 · 0 评论 -
C语言 程序运行之前都干了什么?
文章目录前言程序的翻译环境和执行环境翻译环境编译做了什么?预编译做了什么?编译做了什么?汇编做了什么?链接做了什么?程序的执行环境前言我们在编译器写完代码后,运行程序,让代码跑起来,这个过程的步骤你清楚吗?程序的翻译环境和执行环境在ANSI C的任何一种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。第2种是执行环境,它用于实际执行代码。在学习有没有想过,test.c是如何变成 test.exe可执行程序的。通俗的理解就是:把源文件放到编译环原创 2021-10-02 20:54:49 · 575 阅读 · 0 评论 -
C语言毕业了!!!!附带C语言知识总结+思维导图
经过三个月的学习,C语言终于毕业啦!这期间遇到了不少问题,例如数据的存储这块。从最开始的main函数,到hello world,到条件判断,分支判断,分支循环,到较难的函数和数组,在到指针,还有自定义类型,结构体,联合体,位段,动态内存分配,文件操作函数,程序的编译和链接等等等。刚开始学指针,数组名和指针,指针的左值和右值,指针数组,一开始对指针不是很了解,然后慢慢琢磨发现指针的左值就是指针变量,右值就是指针(地址),,只要了解清楚他们的关系,到后面发现指针也不过如此。只要我们肯花心思去学习,没有什原创 2021-10-16 13:26:25 · 275 阅读 · 0 评论 -
模拟实现strlen库函数
模拟实现strlen函数#include<stdio.h>#include<stdio.h>#include<assert.h>#define NUM 10size_t my_strlen(char *arr){ size_t count = 0; assert(arr != NULL); // 如果arr地址是空地址,则报错 while (*arr) { count++; arr++;原创 2021-08-04 15:05:49 · 75 阅读 · 0 评论 -
数据是怎么在内存中存储的
数据的存储1.无符号整型提升时int main(){ char a = -1; // -1 的二进制位 // 原码 10000000000000000000000000000001 // 反码 11111111111111111111111111111110 // 补码 11111111111111111111111111111111 // 截断 11111111 补码 // 计算机存储的是补码11111111 // 整型提升 按符号位提升 // 111111111原创 2021-08-11 14:30:27 · 137 阅读 · 0 评论 -
模拟实现strcpy库函数
模拟实现strcpy库函数include<stdio.h>#include<assert.h>char* my_strcpy(char* pa,const char* pb){ assert(pa && pb);// 断言 - 判断传参过来是不是空指针,如果是空指针则报错 char* ret = pa; // 一样 assert(pa!=NULL&&pb!=NULL); while (*pa++ =原创 2021-08-04 15:07:43 · 102 阅读 · 0 评论