![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言
文章平均质量分 89
呋喃吖
编程使我快乐
展开
-
详解C语言预处理阶段发生的那些事
前言预编译是源文件编译为可执行文件中的一个步骤之一,而在预编译中发生了很多事情:头文件展开,宏替换,条件编译的处理,去注释等;但是其中还有许许多多的易错点,用不好的话可能会给程序带来无法预料的后果;所以这篇文章就详细的聊聊常见预编译的那些事情。文章目录前言一些预定义的符号#define 定义标识符#define 定义宏#define的替换规则在宏中 #和## 的作用宏与函数的比较一些预定义的符号预定义的符号就是C语言本身就有的符号,这些符号有自己的含义。一般这些符号都是全部字母大小,且以双下划线原创 2021-10-09 09:51:41 · 265 阅读 · 2 评论 -
谈谈C语言从源文件变为可执行文件之间发生的过程详解(C程序的编译链接运行)
文章目录程序的翻译环境和运行环境预处 理编 译汇编 链接程序的翻译环境和运行环境在C语言中,一个源文件代码(.c为后缀的文件)变为可执行文件(windows为:.exe后缀)的过程中经历了什么步骤?首先有两个环境:一个翻译环境,一个运行环境;翻译环境:就是把源代码翻译为计算机可以识别得懂得01二进制代码;运行环境:就是执行代码,运行代码的一个环境;翻译环境完成的工作为:编译+链接的过程;而编译又分为:预处理,编译,汇编三个步骤;所以:一个源文件变为可执行文件中经历的一下的过程;先将源文原创 2021-10-05 01:44:31 · 5941 阅读 · 5 评论 -
谈谈C语言中和文件相关的问题
前言在C语言是提供一些文件操作函数接口,可以操作计算机中的文件。文章目录前言为啥需要文件什么是文件文件指针使用文件的三大步骤使用文件的函数顺序读写使用文件字符输入函数 fgetc 和字符输出函数 fputc简明理解流的概念字符串输入函数 fgets 和字符串输出函数 fputs为啥需要文件不言而喻吧,文件可以永久保存数据,我们平时写的程序数据都是加载到内存的,一旦程序结束后,数据就会丢失,所以需要一种可以永久保存数据的方式,那么就是在磁盘的文件中存储数据。而C语言提供了一系列的对文件操作的函数接口原创 2021-10-03 06:00:00 · 344 阅读 · 1 评论 -
谈谈C语言中的动态内存分配函数使用(malloc calloc realloc free)和动态分配的错误分析
前言在C语言中,如果要使用堆空间的内容的话,可以使用C语言提供的动态内存函数去开辟堆空间,供程序员去使用,在C语言中,提供 4个函数malloc realloc calloc realloc free,其实free是为了释放分配的堆空间的空间,其他三个是申请堆空间。为什么要有动态内存分配堆空间我的理解:首先我们内存本来就会划分好多个分区,就是为了方便内存管理,数据管理的,而在平时我们使用的局部变量全局变量都是存放在不同的空间的,我们不可能一直使用局部变量开辟的空间都是放在栈空间上,因为栈空间在设原创 2021-10-01 17:07:19 · 1401 阅读 · 5 评论 -
C语言中枚举和联合体的使用(enum union)
enum的定义枚举顾名思义就是一一列举,把可能的取值一一列举。枚举的使用方式//定义一个枚举Color的类型enum Color // enum Color 是一个类型{ RED, //逗号结尾 GREEN, BLUE // 最后一个成员没有逗号没有分号};int main(){ printf("%d",RED);//0 printf("%d",GREEN);//1 printf("%d",BLUE);//2 return 0;}{}中的内容是枚举类型的可能取值,也原创 2021-09-23 12:03:07 · 1525 阅读 · 3 评论 -
谈谈C语言中结构体内存对齐问题及其offsetof宏的基本使用
前言在C语言中,变量在内存中摆放的位置是有一定的规则的,不是想摆放到哪里就摆放到哪里,就比如常见的局部变量在栈区,全局变量在全局区等方式;而今天我们聊的结构体里面的成员变量呀,也是有一定的规则存放在内存中的,并不是我们所想那样,连续字节存放滴。文章目录前言结构体内存对齐的规则结构体大小的计算案例为什么要有结构体内存对齐如何自己设置内存对齐数结构体内存对齐的规则结构结构体的第一个成员变量地址与结构体的起始地址偏移量为0 ,换句话说,结构体的第一个成员变量地址与结构体的起始地址相同。除了第一个成员变原创 2021-09-22 18:59:10 · 1192 阅读 · 4 评论 -
C语言中内存函数的使用及其模拟实现(memcpy memmove memset)
mencpy的使用memcpy函数的功能:就是将 num 个字节数的源空间 source 的数据拷贝到目标空间destination 上去,返回值拷贝之后的数据。这个函数很特别,可以拷贝任意的数据类型,不像我们之前了解的strcpy函数,只能拷贝字符串;所以当我们向拷贝任意类型的数据时候可以使用这个函数,注意要确保拷贝过去字节的个数是要匹配上的;这个函数原则上是拷贝不重叠的数据的,但是有一些编译器上实现memcpy是支持拷贝重叠数据的。为了保证通用性,我们使用该函数拷贝数据时候,默认前提是拷贝不原创 2021-09-22 14:35:20 · 505 阅读 · 0 评论 -
模拟实现字符串函数(strlen strcat strcpy strcmp strstr )
文章目录strlen的三种模拟实现方式计数器方式模拟实现strlen指针-指针的方式实现strlen递归的方式实现 strlenstrcat模拟实现strcpy模拟实现strcmp模拟实现strstr模拟实现strlen的三种模拟实现方式strlen的参数设计思路:由于直到长度是不可能为负数,所有返回值设计为 size_t;由于所求的字符串不可能要修改,所以加const 修饰形参str;计数器方式模拟实现strlensize_t my_strlen(const char* str){ i原创 2021-09-21 12:56:08 · 219 阅读 · 0 评论 -
谈谈C语言中常见字符串函数的使用和注意情况【下】(strncpy,strncmp,strncat)
前言前一篇分享了几个字符串操作的函数:谈谈C语言中常见字符串函数的使用和注意情况【上】(strlen,strcpy,strcmp,strcat,strstr),这篇文章来了解下长度受限制的字符串函数。文章目录前言strncpystrncatstrncmpstrncpystrncpy也是字符串拷贝函数,只不过,这个字符串函数拷贝相比于strncpy更加自由了一点,strncpy可以拷贝源字符串的任意长度,而strcpy只能将源字符串的所有字符都拷贝过去。使用情况 char str1[] = "a原创 2021-09-21 10:06:39 · 285 阅读 · 0 评论 -
谈谈C语言中常见字符串函数的使用和注意情况【上】(strlen,strcpy,strcmp,strcat,strstr)
前言c语言中的字符串函数很难维护和使用,经常要考虑是否越界,\0的位置等情况,有时候,在一些编译器使用c语言的字符串函数,编译器还会给你警告⚠提示该函数的不安全;甚至很多面向对象语言,比如Java和C++等,都有自己的string 类自己维护好字符串的方方面面的问题;这样对比起来,说得好像C语言得字符串函数好像真的不堪一击一样,哈哈,可以这么理解吧,但是还是有必要学的,让我一起来了解一下什么是C语言的字符串函数吧。文章目录前言C语言是如何表示字符串的常用字符串函数的大致分类求字符串的长度——str原创 2021-09-20 10:09:47 · 732 阅读 · 3 评论 -
C/C++中的 extern 和extern“C“关键字的理解和使用(对比两者的异同)
前言文章目录前言一. extern关键字extern 的使用场景1extern 的使用场景2extern的用法总结二. extern "C" 的理解和用法extern"C "使用 在C与C++混合开发中;不知道有人是否在意过C中的extern这个关键字,又或者说是否使用过该关键字,当学C++时候,我发现了在C++中有关键字 extern"C"的用法,和C语言中的 extern还是有区别的,所以今天来总结一些对他们的理解,和使用的方式。一. extern关键字extern关键字的用法很简单,就是简简原创 2021-08-29 23:18:38 · 18994 阅读 · 23 评论 -
C/C++中static的关键字的理解总结(对比在C和C++中的区别和相同)
前言static关键字非常好用,特别是早期时候,对于C语言来说,就是靠static关键字完成封装性滴;常见的大型项目中,static用得非常多,并且static关键字也是面试时候的热门关键字之一。在C++中static关键字由于多了类,所以会在C语言的基础上扩展了一些关于类中成员用static关键字修饰的所以掌握非常重要。一. C语言中的static关键字0) static关键字的名字理解static关键字,有人说他命名得不好?因为static翻译为中文是有安静的意思。但是,对于static关键字原创 2021-08-28 10:40:24 · 2208 阅读 · 8 评论 -
C语言中复杂声明的阅读理解
C语言中,有很多复杂声明,通常不理解的话,就很难读懂其表表达的意思,今天我将分享一种阅读复杂声明的方法,帮你扫清阅读障碍,理解复杂声明的意思。阅读原则阅读复杂声明是有规律的:首先:我们要从标识符开始(即变量名),假如没有标识符的话,那么我们就从最内层结构,什么是最内层结构呢?通常就是声明的中间位置的括号开始。其次:开始往右阅读,当碰到一个右)括号,或者结束位置时候,看到什么就说出什么;说完后,继续往左看,知道碰到(左括号,或者回到了最开始的头部,看到什么就是说出什么;最后:看完一层括号后,跳出这原创 2021-08-22 22:10:25 · 233 阅读 · 3 评论 -
C语言指针的那些事:第四篇(最终篇)(笔试面试题,对指针的高度理解)
不多说什么,直接上题目,带你掌握指针中的精髓题目。助你对指针有进一步的理解。画图是对指针理解最重要的一步,不要以为编程就是敲代码,敲代码只是体力活,思考的过程才是关键。注意:测试平台为vs2013,32位条件下,指针的大小位 4个字节。第一题请问下面输出的结果是什么?int main(){ int a[5] = { 1, 2, 3, 4, 5 }; int *ptr = (int *)(&a + 1); printf( "%d,%d", *(a + 1), *(ptr - 1原创 2021-08-19 11:52:59 · 1014 阅读 · 17 评论 -
C语言中的回调函数(函数指针的应用,qsort的理解和用法)
文章目录1. 回调函数2. void* 指针类型的基本认识3. qsort 的基本使用4. 利用函数指针书写排序任意类型的冒泡排序1. 回调函数回调函数通俗的讲就是通过函数指针(作为另一个函数形参的)调用的函数。一般我们是把回调函数名(地址)作为参数,传递给另一个函数,在另一个函数中通过该回调函数指针,去调用它所指向的函数。其实是什么不重要,主要是一个函数指针的应用而已。2. void* 指针类型的基本认识首先 void* 指针类型是一个可以接受任意类型的指针类型,其通用性非常广,比如:i原创 2021-08-17 23:34:40 · 903 阅读 · 3 评论 -
C语言中 sizeof 和 strlen 和数组名结合的相关问题
sizeof()和 strlen( )的认识首先我们得清楚一个问题:数组名是首元素的地址;但是在一下这两种情况表示的认知不是首元素地址。1. sizeof(arr);在sizeof()中,单独数组名出现,表示数组得整个大小,不是首元素地址大小。2. &arr ,对于取地址数组名,表示的是整个数组的地址。那么接下来我们必须知道,sizeof(),求的是在括号()里面表达式子或者类型的大小,以字节为单位;而strlen();是一个字符串函数,括号里接收是地址,求得该地址往后,碰到\0结束为止原创 2021-08-17 11:51:57 · 630 阅读 · 5 评论 -
C语言指针的那些事:第三篇(函数指针,指针函数,函数指针数组,指向函数指针数组的指针)
文章目录1. 函数指针1)函数指针的例题2. 指针函数3. 函数指针数组1)函数指针数组的用途4. 指向函数指针数组的指针5. 一些后话1. 函数指针函数指针就是指向函数的指针;本质上还是一个指针首先我们要知道函数的地址就是函数名,取地址函数名也是函数的地址;这两个方式事等价的类如:int Add(int x, int y){ return x + y;}# include<stdio.h>int main(){ int(*p)(int, int) = Add; //这里原创 2021-08-15 17:25:46 · 1912 阅读 · 8 评论 -
C语言指针的那些事:第二篇(字符指针,数组指针,指针数组,指针传参,数组传参设计思考方式)
指针数组和数组指针很多人都搞混这两个名词,其实有个记忆方式指针数组:数组在后面,所以说指针数组是个数组,数组里存放的是指针;数组指针:指针在后面,所以说数组指针是个指针,指向数组的指针;指针数组指针数组int a = 10;int b = 20;int c = 30;int *arr[3] = {&a,&b,&c};指针数组就是数组,数组里面的元素是指针,即地址;那我要访问 arr数组的元素就是 arr[ i ];比如得到arr[0]就是 &a;也就原创 2021-08-14 19:01:20 · 853 阅读 · 5 评论 -
C语言指针的那些事:第一篇(有指针书写的技巧)
前言指针相信大家都或多或少了解过一点,大多数朋友对指针都是望而却步,原因是因为指针总是很绕人,什么地址,什么解引用,什么指向的概念,又或者传参时候传指针可以改变外面的实参,多级指针啥啥的…。确实,指针是一个庞大的系统知识,晦涩难懂,不过,今天我要挑战这个回溯难懂的东西,把我对指针的理解分享出来。提示:本指针都是在32位的测试下来的。简易的内存模样要了解指针,不得不先了解内存这个东西,形象的感官理解内存;从实体来看就是一个计算机的硬件设备,而虚拟的来看就是一个由多个格子组成的长方形。每个格子都原创 2021-08-11 21:58:58 · 753 阅读 · 2 评论 -
大端存储模式和小端存储模式的问题
前言我们知道,数据存储在内存中是分大小端模式存储的。 那什么是大端模式,什么是小段模式? 又如何判断通过程序判断是大端模式呢? 为什么会有大端模式和小端模式呢?注意:我的测试环境为vs2013。文章目录前言大小端模式的定义为什么有大小端模式用程序判断计算机是大端模式还是小端模式大小端模式的定义首先观察一段小语句的代码:int main(){ int a = 0x11223344;//以十六进制的方式存入a return 0;}我们给 这语句打一个断点,按F5,指向看看内存中原创 2021-08-10 21:36:43 · 284 阅读 · 0 评论 -
C语言中浮点数在内存存储的问题
文章目录一个小例题浮点数在内存的存储规则浮点数的分解形式规定浮点数在内存表示形式回到第一个题的解释一个小例题????请问下面输出的结果是什么?得出结果看看和自己预期的是否一样。int main(){int n = 9;float *pFloat = (float *)&n;printf("n的值为:%d\n",n);printf("*pFloat的值为:%f\n",*pFloat);*pFloat = 9.0;printf("num的值为:%d\n",n);printf("*原创 2021-08-10 12:35:42 · 474 阅读 · 2 评论 -
深度剖析整数在内存中存储的问题
前言我们都知道整数在内存的存储方式是以补码的形式存储的。但是具体存储的细节是如何的呢?还有整数相关的一些源码反码补码,问题,一些字大小端的问题,一些数据为什么明明是负数,却输出时候是正数…等一系列的问题,都在这里会解决。文章目录前言变量类型整数的原反补码的理解整形存储的本质变量????????????这里引出三个问题: 什么是变量? 变量用来做什么? 为什么需要定义变量?可能大家都没想过这个问题:????什么是变量?答: 变量就是在内存中的某一个位置开辟的一段空间。具体在哪个位原创 2021-08-09 22:45:27 · 646 阅读 · 14 评论 -
谈谈C语言函数栈帧创建和销毁(细)
前言我们都知道函数是在栈区开辟空间的,但你是否知道: 函数栈帧是什么? 函数是如何在栈区开辟空间的呢? 函数的实参是如何传参的?传参的顺序如何? 为什么函数形参无法改变外部的变量? 为什么说实参是形参的一份临时拷贝? 形参和实参的关系又是什么? 函数是怎么调用的? 函数调用是如何返回值的? 局部变量是如何在栈开辟空间的? 为什么说局部变量的值是随机的?这篇文章都已给你解答这些问题,接下来跟着我一起走下去,让我们一起进入函数是如何在栈区中玩耍的旅途。我们慢慢来回倒这个问题?原创 2021-08-08 00:21:03 · 597 阅读 · 7 评论 -
C语言操作符的那些事(详细全)
前言C语言中操作符不多,但是有些相同的操作符都是在不同的表达式中,有不同的解释意思,比如 * 号,在表达式中5*5表示乘号,在int *p表示指针,在 *p = 10中,又表示解引用,所以今天就来详细的整理一下C语言中的操作符,做到心中有数,可以一眼识破,用途有哪些。重点不是记忆:是理解,兄弟们,要动本质。文章目录前言操作符的分类算术操作符移位操作符位操作符赋值操作符单目操作符关系操作符逻辑操作符条件操作符逗号表达式操作符的分类注意:以下操作符都必须是英文的半角符号。算术操作符+ *原创 2021-07-31 16:13:06 · 6882 阅读 · 45 评论 -
基于c语言的简单小游戏-(三子棋)
前言阅读水平条件:C语言的基本语法: 条件语句if,switch; 循环语句for ,while, do while, 函数 数组文章目录前言一. 三子棋效果展示二. 三子棋的需求分析三. 三子棋的代码实现1) 三子棋的菜单和交互逻辑的实现2)三子棋的初始化3)三子棋的界面显示4)三子棋玩家移动5)三子棋电脑移动6)三子棋判断输赢一. 三子棋效果展示大概就是玩家选择对应的坐标下棋,电脑会自动下棋;直到游戏结束,或者平局。二. 三子棋的需求分析三子棋游戏需要一个3 × 3原创 2021-07-29 17:32:50 · 1193 阅读 · 2 评论 -
基于C语言的简单小游戏-(扫雷)
前言阅读水平条件:C语言的基本语法: 条件语句if,switch; 循环语句for ,while, do while, 函数 数组文章目录前言一 扫雷游戏的需求二 扫雷游戏的需求分析三 扫雷的代码实现1 扫雷的菜单和交互逻辑的实现2 扫雷游戏的功能1)扫雷的初始化功能2)扫雷的显示功能3)扫雷的设置雷信息4)扫雷的排雷功能一 扫雷游戏的需求我们实现一个 9 * 9 的宫格扫雷,有81 个格子,在 81个格子随机放入 10个雷;当输入格子对应坐标时候,开始扫雷,扫到雷游戏结束,没扫到雷,原创 2021-07-28 22:20:55 · 6022 阅读 · 14 评论