编程语言C
文章平均质量分 57
薇远镖局
态度决定一切!
展开
-
C语言snprintf():将格式化字符串输出到数组中
snprintf() 是 C语言的一个标准库函数,定义在<stdio.h>头文件中。snprintf() 函数的功能是格式化字符串,并将结果存储在指定的字符数组中。原创 2024-03-10 20:26:48 · 1673 阅读 · 0 评论 -
C语言实现一个简易的环形FIFO
设计一个环形FIFO缓冲区,用于存储原始数据。环形FIFO缓冲区最大有10个节点,每个节点有200个原始数据,即200个unsigned int类型的数据。其中,包括写FIFO函数,读FIFO函数,删除某节点函数,删除整个FIFO函数等。原创 2024-02-12 13:02:06 · 547 阅读 · 0 评论 -
C语言_断言assert详解
if(假设成立)程序正常运行;else报错&&终止程序!(避免由程序运行引起更大的错误)但是这样写的话,就会有无数个 if 语句,甚至会出现,一个 if 语句的括号从文件头到文件尾,并且大多数情况下,我们要进行验证的假设,只是属于偶然性事件,又或者我们仅仅想测试一下,一些最坏情况是否发生,所以这里有了assert()。assert 宏的原型定义在assert.h中,其作用是如果它的条件返回错误,则终止程序执行。原创 2023-10-28 20:50:40 · 1218 阅读 · 0 评论 -
C语言中如何用 printf 格式化打印16进制
【代码】C语言中如何用 printf 格式化打印16进制。原创 2023-04-01 17:56:50 · 6487 阅读 · 0 评论 -
c语言回调函数的使用及实际作用详解【学习】
c语言回调函数的使用及实际作用详解转载 2022-12-27 22:26:20 · 573 阅读 · 0 评论 -
static关键字的作用【C语言】
static关键字的作用原创 2022-12-26 18:22:49 · 230 阅读 · 0 评论 -
8位二进制数的原码、反码、补码以及它能表示的范围
8位二进制数的原码、反码、补码以及它能表示的范围转载 2022-12-23 09:36:32 · 4687 阅读 · 2 评论 -
const常量与#define宏定义的区别【笔记】
const常量与#define宏定义的区别【笔记】原创 2022-09-16 20:53:34 · 121 阅读 · 0 评论 -
memcpy和strcpy的区别以及运行效率【笔记】
memcpy和strcpy的区别以及运行效率【笔记】转载 2022-09-16 20:12:40 · 1283 阅读 · 0 评论 -
C语言函数之可变参数原理:va_start、va_arg及va_end
说到C语言函数可变参数,我们最先想到的可能就是printf、scanf、printk了。在Linux-2.6.24.7内核源码里,printk函数原型如下: asmlinkageintprintk(constchar*fmt,...) asmlinkage表示通过堆栈传递参数。gcc编译器在汇编过程中调用c语言函数时传递参数有两种方法:一种是通过堆栈,另一种是通过寄存器。缺省时采用寄存器,假如你要在你的汇编过程中调用c语言函数,并且想通过堆栈传递参数,你定...转载 2022-05-04 22:45:45 · 7839 阅读 · 1 评论 -
快速寻找单链表的中间结点【C语言】
1、思路:(1)有两个指针同时从开头(首元结点)遍历(2)一个快指针一次走两步,一个慢指针一次走一步(3)快指针先到链表尾部,慢指针恰好到达链表中部(当链表长度为奇数时,慢指针指向的是链表中间结点;当链表长度为偶数时,慢指针指向的结点和慢指针指向结点的下一个结点都是链表的中间结点)2、示例代码//设立两个指针fast和slow,它们分别从head开始,fast走两步slow走一步,当fast走到最后一个结点的时候slow正好走到中点// 其中head为带头结点的链表的头指针Node*原创 2022-04-17 23:45:47 · 1725 阅读 · 0 评论 -
C语言,log打印文件名、函数名、行号、日期时间
C语言,log打印文件名、函数名、行号、日期时间原创 2022-01-28 20:58:45 · 1896 阅读 · 0 评论 -
几个关于指针的声明【C语言】
原创 2021-05-14 19:04:44 · 186 阅读 · 0 评论 -
C语言回调函数【C语言】
什么是回调函数我们先来看看百度百科是如何定义回调函数的:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。这段话比较长,也比较绕口。下面我通过一幅图来说明什么是回调:假设我们要使用一个排序函数来对数组进行排序,那么在主程序(Main program)中,我们先通过库,选择转载 2021-05-14 16:40:44 · 1347 阅读 · 0 评论 -
inline详细讲解【C语言】
本文介绍了GCC和C99标准中inline使用上的不同之处。inline属性在使用的时候,要注意以下两点:inline关键字在GCC参考文档中仅有对其使用在函数定义(Definition)上的描述,而没有提到其是否能用于函数声明(Declare)。从 inline的作用来看,其放置于函数声明中应当也是毫无作用的:inline只会影响函数在translation unit(可以简单理解为C源码文件)内的编译行为,只要超出了这个范围inline属性就没有任何作用了。所以inline关键字不应该出现在函数声明转载 2021-05-13 11:16:52 · 957 阅读 · 0 评论 -
[c&cpp] 内联函数(inline)总结
1:定义: 它们看起来象函数,运作起来象函数,比宏(macro)要好得多,使用时还不需要承担函数调用的开销。当内联一个函数时,编译器可以对函数体执行特定环境下的优化工作。这样的优化对"正常"的函数调用是不可能的。2:规则: inline关键字必须和函数体定义放在一起才可以实现内联,仅仅将inline放在函数声明之前不起任何作用。inline是一个用于实现的关键字而不是一个用于声明的关键字。对于类方法,定义在类体内部的方法自动成为内联方法。3:实现思想: 内联函数...转载 2021-05-13 11:00:52 · 265 阅读 · 0 评论 -
关键字 inline (内联函数)用法解析【C语言】
一、什么是内联函数在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。为了解决这个问题,特别的引入了inline修饰符,表示为内联函数。栈空间就是指放置程式的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足所造成的程式出错的问题,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。下面我们来看一个例子:#include <stdio.h>...转载 2021-05-13 10:56:50 · 750 阅读 · 0 评论 -
共用体(union)详解【C语言】
我们知道结构体(Struct)是一种构造类型或复杂类型,它可以包含多个类型不同的成员。在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为:union 共用体名{ 成员列表};共用体有时也被称为联合或者联合体,这也是 Union 这个单词的本意。结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能..转载 2021-05-13 09:01:44 · 1220 阅读 · 0 评论 -
选择法排序与冒泡法排序【C语言】
1、选择法排序/*选择法排序:由小到大工作原理如下:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。*/void sel_sort_s2b(int arr[], int n){ int min; int temp; for (int i = 0; i<(n - 1); i++) { min = i; for (int j = i + 1;原创 2021-05-12 09:20:16 · 1206 阅读 · 0 评论 -
冒泡排序【C语言】
冒泡排序是最简单的排序方法,理解起来容易。虽然它的计算步骤比较多,不是最快的,但它是最基本的,初学者一定要掌握。冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。比如对下面这个序列进行从小到大排序:90 21 132 -58 34第一轮:...原创 2021-05-07 17:25:04 · 171 阅读 · 0 评论 -
“四舍六入五成双规则” 与 C语言如何实现“四舍五入”
1、四舍六入五成双规则对于位数很多的近似数,当有效位数确定后,其后面多余的数字应该舍去,只保留有效数字最末一位,这种修约(舍入)规则是“四舍六入五成双”,也即“4舍6入5凑偶”这里“四”是指≤4 时舍去,"六"是指≥6时进上,"五"指的是根据5后面的数字来定,当5后有有效数时,舍5入1;当5后无有效数字时,需要分两种情况来讲:①5前为 奇数,舍5入1;②5前为偶数,舍5不进。(0是 偶数)测试1代码:void test_1(void){ /* 四舍六入五成双规则: 对于位数很多的近似数原创 2021-04-15 11:15:44 · 5093 阅读 · 5 评论 -
stm32进入HardFault的异常定位方法
在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler函数里的死循环while(1)中。这说明STM32出现了硬件错误。STM32出现硬件错误可能有以下原因:(1)数组越界操作;(2)内存溢出,访问越界;(3)堆栈溢出,程序跑飞;(4)中断处理错误;遇到这种情况,可以通过以下2种方式来定位到出错代码段。方法1:通过地址分析查找...转载 2021-04-07 10:33:48 · 967 阅读 · 0 评论 -
stm32进入HardFault的异常定位方法
在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler函数里的死循环while(1)中。这说明STM32出现了硬件错误。STM32出现硬件错误可能有以下原因:(1)数组越界操作;(2)内存溢出,访问越界;(3)堆栈溢出,程序跑飞;(4)中断处理错误;遇到这种情况,可以通过以下2种方式来定位到出错代码段。方法1:通过地址分析查找...原创 2021-04-07 10:26:32 · 8271 阅读 · 3 评论 -
结构体字节对齐,C语言结构体字节对齐详解
问大家一个问题:struct STUDENT{ char a; int b;}data;如上结构体变量 data 占多少字节?char 占 1 字节,int 占 4 字节,所以总共占 5 字节吗?我们写一个程序验证一下:# include <stdio.h>struct STUDENT{ char a; int b;}data;int main(void){ printf("%p, %p\n", &data.a, &a转载 2021-04-02 14:20:44 · 234 阅读 · 0 评论 -
函数指针
对于这么的一个指针,首先我们还是从定义开始,定义一个指针 并取个名字叫pfun,(pfun),这个指针是指向一个函数的,这个函数的结构是:返回值是int类型的,,函数有两个参数也是int类型的,int (*pfun)(int, int); 由于这样的指针看上去会很复杂 所以我们一般将这种指针typedef一下:typedef int (*int_pfun_int_int_t)(int, int);将这种类型的指针变量重新命名为int_pfun_int_int_t,我们定义这种类型...原创 2021-02-16 15:15:49 · 125 阅读 · 0 评论 -
二级指针
多级指针(pointer to pointer to)是指向指针的指针,二级指针是指向一级指针的指针。一级指针指向的是某个变量,也就是一级指针中存储的是某个变量的内存地址;二级指针指向一级指针,也就是二级指针中存储的是一级指针的内存地址。int main(void){ int a = 10; //声明一个变量a int *p = &a; //声明指针p,指向变量a int *原创 2021-02-14 13:44:29 · 721 阅读 · 0 评论 -
C语言单链表操作【已测试】
// LinkTest.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "stdio.h"#include "stdlib.h"#include "string.h"typedef struct{ int data;}UsrCommData;typedef struct NODE{ UsrCommData usr_info; struct NODE *next;}CommNode;CommNode *headNo.原创 2021-02-14 13:14:08 · 131 阅读 · 0 评论