
C语言基础
文章平均质量分 64
jk_101
不停的学习。
展开
-
C语言各数据类型大小和取值范围
参考链接:C语言各数据类型大小和取值范围_c不同数据类型精度-优快云博客原创 2024-01-20 17:13:22 · 542 阅读 · 1 评论 -
二级指针动态分配二维数据的方法
参考链接:二级指针动态分配二维数据的方法原创 2023-11-29 09:22:01 · 139 阅读 · 0 评论 -
彻底理解C语言中的指针
参考链接:彻底理解C语言中的指针原创 2023-11-07 10:00:00 · 103 阅读 · 1 评论 -
C语言常用的几个工具函数
而对应的十进制为 65 整型65,4个字节32bit,即u32 十六进制为 0x41 二进制为 0000 0000 0000 0000 0000 0000 0100 0001。效果:len为数据类型为 u16(short),比如 0x11 0x22,转为u8(usigned char)数组。效果:十六进制:0x13 0xAA 0x02转为字符串:”13AAA2”效果:整型 50 转字符数组 {‘\0’,’\0’,’\0’,’2’}效果:字符数组 {‘\0’,’\0’,’\0’,’2’}转为整型 50。转载 2023-06-14 09:32:04 · 324 阅读 · 0 评论 -
单片机中常用的轻量级校验算法
通过MD5算法进行加密,文件就可以获得一个唯一的MD5值,这个值是独一无二的,就像我们的指纹一样,因此我们就可以通过文件的MD5值来确定文件是否正确,密码进行加密后也会生成MD5值,论坛就是通过MD5值来验证用户的密码是否正确的。CRC有多种变体,比如:CRC-1、 CRC-5-USB、 CRC-8、 CRC-16、 CRC-32、 CRC-64等。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。转载 2023-05-19 10:00:00 · 418 阅读 · 0 评论 -
C语言进阶之 回调函数详解
如上述代码:可以看到,Handle() 函数里面的参数是一个指针,在 main() 函数里调用 Handle() 函数的时候,给它传入了函数 Callback_1()/Callback_2()/Callback_3() 的函数名,这时候的函数名就是对应函数的指针,也就是说,回调函数其实就是函数指针的一种用法。结合这幅图和上面对回调函数的解释,我们可以发现,要实现回调函数,最关键的一点就是要将函数的指针传递给一个函数(上图中是库函数),然后这个函数就可以通过这个指针来调用回调函数了。转载 2023-05-05 10:55:32 · 382 阅读 · 0 评论 -
C基础学习之C 结构体
为了定义结构,必须使用struct语句。...tag是结构体标签。是标准的变量定义,比如 int i;或者 float f,或者其他有效的变量定义。结构变量,定义在结构的末尾,最后一个分号之前,可以指定一个或多个结构变量。} book;在一般情况下,这 3 部分至少要出现 2 个。以下为实例://此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c//同时又声明了结构体变量s1//这个结构体并没有标明其标签structint a;char b;double c;原创 2023-03-10 09:46:50 · 497 阅读 · 1 评论 -
C语言|void 指针
C语言中,*类型就是指针类型,比如 int *p,double *q,虽然是不一样的指针,但是大小却一样sizeof(p) == sizeof(q),因为它们都是同一种类型*类型的。C语言是强类型的语言,对类型的区分十分严格,不同的类型占据的空间大小不同,地址偏移量也会不同;当void*指针作为函数的输入和输出时,表示可以接受任意类型的输入指针和输出任意类型的指针。void*可以指向任何类型的地址,但是带类型的指针不能指向void*的地址。看看下面的用法:。转载 2023-03-05 10:54:18 · 881 阅读 · 0 评论 -
强烈推荐!10个超赞的C语言开源项目
的内核源代码包括设备驱动程序在内约有 1 万行,这个数量的源代码,初学者是能够充分理解的。基于 Reactor 模式,效率较高,并且代码精简(4.15 版本 8000 多行),是学习事件驱动编程的很好的资源。由于简洁的设计和先进的特征,使得它在生产和研究方面,都有卓越的表现,而且它也有受使用者支持的完整的源代码。另一方面,最近的操作系统,例如 Linux 最新版的内核源代码据说超过了 1000 万行。是C语言中的一个JSON编解码器,非常轻量级,C文件只有 500 多行,速度也非常理想。转载 2023-03-07 09:32:43 · 3952 阅读 · 0 评论 -
嵌入式开发:void*在工程中的应用
对于我而言,设计软件框架时,Callout必不可少,Callout不仅能增加代码的延展性,避免后期改框架,修成"胖子",还方便移植,复用性高。如上的示意代码中,设计的模块,前后各预留一个Callout,且函数指针的入参使用void*,这样可以使得传入的参数为任何类型,极大的增加了代码的灵活性。既然是指针,就会指向一块地址,void*也不例外,但是,由于其特殊性,未有事先说明自己指向的类型,所以,在使用前,需要强制告知其指向的类型。在很多的C库函数中,void*也被广泛的使用,如下所示:。转载 2024-05-08 08:36:23 · 98 阅读 · 1 评论 -
嵌入式 C 语言中 const 的多种用法
C语言标准库中很多函数的参数都被 const 限制了,但我们在以前的编码过程中并没有注意这个问题,经常将非 const 类型的数据传递给 const 类型的形参,这样做从未引发任何副作用,原因就是上面讲到的,将非 const 类型转换为 const 类型是允许的。const 和指针结合的写法多少有点让初学者摸不着头脑,大家可以这样来记忆:const 离变量名近就是用来修饰指针变量的,离变量名远就是用来修饰指针指向的数据,如果近的和远的都有,那么就同时修饰指针变量以及它指向的数据。转载 2024-05-11 08:42:45 · 71 阅读 · 1 评论 -
C语言 浅聊结构体
struct 结构体名{成员列表};int num;char sex;int age;// 成绩// 结构体类型声明,注意最后一定要加分号说明:这里把学号、姓名、性别等属性叫做成员。先声明结构体名,再定义变量名,示例如下。转载 2024-06-05 08:42:57 · 80 阅读 · 1 评论 -
C语言 指针作为函数的参数
同样的,在函数的定义上,因为我们传入的参数是 a 的地址,所以函数内对于形参 num 数据的改变会直接反映到 a 上面,也就是对 a 本身进行更改。这段代码中可以看到,调用函数时传入的参数前面多了个 &,也就是取地址符号,这就表示我们传入的参数不再是 a 的值,而是 a 的地址。因为我们传入函数的参数其实并不是真正的 a,传入的参数只是把 a 的值复制了一份,传入的只是跟 a 相等的一个数值。如果我们想要让传入的参数是 a 本身的话,就需要传入 a 的地址,而不是 a 的值,也就是指针作为函数的参数。转载 2024-05-13 08:40:25 · 200 阅读 · 1 评论 -
C语言:构造对象
对象是 C 语言中最重要的概念。有基础的小伙伴可能会反问:“C 语言不是面向过程的吗?怎么会有对象呢?好像C++、Java之类的语言才有对象!”说的没错,但是这样问显然是未曾对 C 的灵魂——指针进行过探索。你可能听过“指针是 C 语言的灵魂所在”、“利用指针可以实现高级语言提供的操作”之类的话。那么接下就让我们乘坐“指针”的快车,在 C 语言中构造一个真正的对象。既然是构造对象,那就免不了描述对象的内部结构,即对象本身的数据结构,很显然,struct结构体就很适合,但是struct。转载 2024-06-03 08:43:31 · 97 阅读 · 1 评论 -
C语言基础:do{...}while(0)的使用
在Lwip中,会经常看到宏定义do{...}while(0)的结构。如上示例可以看出,使用宏替换多条语句,会方便的多。:定义宏Get_OptResult(a, b, c, d)精简代码c = ((a) + (b));如上,使用do{...}while(0)结构,宏展开以后,吸收了分号";:使用do{...}while(0)构造后的宏定义,可避免大括号、分号等的影响。本文,我们就聊聊宏定义与do{...}while(0)的结合。综上,在使用宏定义多条语句时,do{...}while(0)结构不妨一试。转载 2023-01-29 09:13:34 · 979 阅读 · 1 评论 -
C基础学习之C 排序算法
插入排序在实现上,通常采用in-place排序(即只需用到 {\displaystyle O(1)} {\displaystyle O(1)}的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。在区间中随机挑选一个元素作基准,将小于基准的元素放在基准之前,大于基准的元素放在基准之后,再分别对小数区与大数区进行排序。原创 2022-11-16 10:00:00 · 149 阅读 · 0 评论 -
C基础学习之C 命令行参数
多个命令行参数之间用空格分隔,但是如果参数本身带有空格,那么传递参数的时候应把参数放置在双引号 "" 或单引号 '' 内部。让我们重新编写上面的实例,有一个空间,那么你可以通过这样的观点,把它们放在双引号或单引号""""。是一个指向第一个命令行参数的指针,*argv[n] 是最后一个参数。如果没有提供任何参数,argc 将为 1,否则,如果传递了一个参数,是一个指针数组,指向传递给程序的每个参数。,它们对程序很重要,特别是当您想从外部控制程序,而不是在代码内对这些值进行硬编码时,就显得尤为重要了。原创 2022-11-18 10:00:00 · 287 阅读 · 0 评论 -
C基础学习之C 内存管理
本章将讲解 C 中的动态内存管理。C 语言为内存的分配和管理提供了几个函数。这些函数可以在头文件中找到。void * 类型表示未确定类型的指针。C、C++ 规定 void * 类型可以通过类型转换强制转换为任何其它类型的指针。原创 2022-11-15 10:00:00 · 140 阅读 · 0 评论 -
C基础学习之C 可变参数
有时,可能会碰到这样的情况,您希望函数带有可变数量的参数,而不是预定义数量的参数。C 语言为这种情况提供了一个解决方案,它允许您定义一个函数,能根据具体的需求接受可变数量的参数。下面的实例演示了这种函数的定义。被调用两次,每次第一个参数都是表示被传的可变参数的总数。省略号被用来传递可变数量的参数。当上面的代码被编译和执行时,它会产生下列结果。头文件,该文件提供了实现可变参数功能的函数和宏。,代表了要传递的可变参数的总数。最后一个参数写成省略号,即三个点号(),省略号之前的那个参数是。原创 2023-03-29 10:00:00 · 311 阅读 · 1 评论 -
C基础学习之C 递归
递归指的是在函数的定义中使用函数自身的方法。举个例子:从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?"从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?'从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……'"流程图:C 语言支持递归,即一个函数可以调用其自身。但在使用递归时,程序员需要注意定义一个从函数退出的条件,否则会进入死循环。原创 2023-03-30 10:00:00 · 101 阅读 · 1 评论 -
C基础学习之C 错误处理
C 语言不提供对错误处理的直接支持,但是作为一种系统编程语言,它以返回值的形式允许您访问底层数据。在发生错误时,大多数的 C 或 UNIX 函数调用返回 1 或 NULL,同时会设置一个错误代码,该错误代码是全局变量,表示在函数调用期间发生了错误。您可以在 errno.h 头文件中找到各种各样的错误代码。所以,C 程序员可以通过检查返回值,然后根据返回值决定采取哪种适当的动作。开发人员应该在程序初始化时,把 errno 设置为 0,这是一种良好的编程习惯。0 值表示程序中没有错误。原创 2024-07-05 08:42:30 · 482 阅读 · 1 评论 -
C基础学习之C 强制类型转换
强制类型转换是把变量从一种类型转换为另一种数据类型。例如,如果想存储一个 long 类型的值到一个简单的整型中,需要把 long 类型强制转换为 int 类型。可以使用这里要注意的是强制类型转换运算符的优先级大于除法,因此的值首先被转换为型,然后除以 count,得到一个类型为 double 的值。类型转换可以是隐式的,由编译器自动执行,也可以是显式的,通过使用来指定。在编程时,有需要类型转换的时候都用上强制类型转换运算符,是一种良好的编程习惯。原创 2024-06-19 08:34:33 · 481 阅读 · 1 评论 -
C基础学习之C 头文件
头文件是扩展名为的文件,包含了 C 函数声明和宏定义,被多个源文件中引用共享。有两种类型的头文件:程序员编写的头文件和编译器自带的头文件。在程序中要使用头文件,需要使用 C 预处理指令来引用它。前面我们已经看过头文件,它是编译器自带的头文件。引用头文件相当于复制头文件的内容,但是我们不会直接在源文件中复制头文件的内容,因为这么做很容易出错,特别在程序是由多个源文件组成的时候。原创 2022-11-20 10:00:00 · 474 阅读 · 1 评论 -
C基础学习之C 预处理器
ANSI C 定义了许多宏。在编程中您可以使用这些宏,但是不能直接修改这些预定义的宏。宏描述__DATE__当前日期,一个以 "MMM DD YYYY" 格式表示的字符常量。__TIME__当前时间,一个以 "HH:MM:SS" 格式表示的字符常量。__FILE__这会包含当前文件名,一个字符串常量。__LINE__这会包含当前行号,一个十进制常量。__STDC__当编译器以 ANSI 标准编译时,则定义为 1。main(){}当上面的代码(在文件test.c。原创 2022-11-19 10:00:00 · 172 阅读 · 1 评论 -
C基础学习之C 文件读写
上一章我们讲解了 C 语言处理的标准输入和输出设备。本章我们将介绍 C 程序员如何创建、打开、关闭文本文件或二进制文件。一个文件,无论它是文本文件还是二进制文件,都是代表了一系列的字节。C 语言不仅提供了访问顶层的函数,也提供了底层(OS)调用来处理存储设备上的文件。本章将讲解文件管理的重要调用。原创 2023-10-08 08:39:50 · 158 阅读 · 1 评论 -
C基础学习之C 输入 & 输出
当我们提到时,这意味着要向程序填充一些数据。输入可以是以文件的形式或从命令行中进行。C 语言提供了一系列内置的函数来读取给定的输入,并根据需要填充到程序中。当我们提到时,这意味着要在屏幕上、打印机上或任意文件中显示一些数据。C 语言提供了一系列内置的函数来输出数据到计算机屏幕上和保存数据到文本文件或二进制文件中。原创 2023-05-02 10:00:00 · 3605 阅读 · 1 评论 -
C基础学习之C typedef
C 语言提供了关键字,可以使用它来为类型取一个新的名字。下面的实例为单字节数字定义了一个术语在这个类型定义之后,标识符 BYTE 可作为类型也可以使用来为用户自定义的数据类型取一个新的名字。原创 2024-07-02 08:37:01 · 213 阅读 · 1 评论 -
C基础学习之C 位域
struct 位域结构名{位域列表};元素描述type只能为 int(整型),unsigned int(无符号整型),signed int(有符号整型) 三种类型,决定了如何解释位域的值。位域的名称。width位域中位的数量。宽度必须小于或等于指定类型的位宽度。带有预定义宽度的变量被称为位域。上面的结构定义指示 C 编译器,age 变量将只使用 3 位来存储这个值,如果您试图使用超过 3 位,则无法完成。原创 2022-11-13 09:54:06 · 199 阅读 · 0 评论 -
C基础学习之C 共用体
为了定义共用体,必须使用union语句,方式与定义结构类似。union 语句定义了一个新的数据类型,带有多个成员。{...是可选的,每个 member definition 是标准的变量定义,比如 int i;或者 float f;或者其他有效的变量定义。在共用体定义的末尾,最后一个分号之前,您可以指定一个或多个共用体变量,这是可选的。float f;} data;现在,Data类型的变量可以存储一个整数、一个浮点数,或者一个字符串。原创 2024-07-03 08:41:24 · 470 阅读 · 1 评论 -
C基础学习之C 字符串
其实,不需要把 null 字符放在字符串常量的末尾。C 编译器会在初始化数组时,自动把 \0 放在字符串的末尾。)又称结束符,缩写 NUL,是一个数值为 0 的控制字符,\0 是转义字符,意思是告诉编译器,这不是字符 0,而是空字符。在 C 语言中,字符串实际上是使用空字符 \0 结尾的一维字符数组。因此,\0 是用于标记字符串的结束。由于在数组的末尾存储了空字符 \0,所以字符数组的大小比单词。可以在 C 标准库中找到更多字符串相关的函数。下面的声明和初始化创建了一个。原创 2024-07-04 08:31:21 · 286 阅读 · 1 评论 -
C基础学习之C 函数指针
函数指针是指向函数的指针变量。通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。函数指针可以像一般函数一样,用于调用函数、传递参数。原创 2023-10-10 19:53:48 · 155 阅读 · 2 评论 -
C基础学习之C 从函数返回指针
在上一章中,我们已经了解了 C 语言中如何从函数返回数组,类似地,C 允许从函数返回指针。另外,C 语言不支持在调用函数时返回局部变量的地址,除非定义局部变量为。原创 2023-04-30 10:00:00 · 359 阅读 · 1 评论 -
C基础学习之C 传递指针给函数
C 语言允许您传递指针给函数,只需要简单地声明函数参数为指针类型即可。原创 2023-04-29 10:00:00 · 275 阅读 · 1 评论 -
C基础学习之C 指向指针的指针
指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。一个指向指针的指针变量必须如下声明,即在变量名前放置两个星号。例如,下面声明了一个指向 int 类型指针的指针:int **var;当一个目标值被一个指针间接指向到另一个指针时,访问这个值需要使用两个星号运算符,如下面实例所示:#include <std...原创 2021-08-25 08:32:46 · 391 阅读 · 0 评论 -
C基础学习之C 指针数组
在我们讲解指针数组的概念之前,先让我们来看一个实例,它用到了一个由 3 个整数组成的数组:#include <stdio.h> const int MAX = 3; int main (){ int var[] = {10, 100, 200}; int i; for (i = 0; i < MAX; i++) { printf("Value of var[%d] = %d\n", i, var[i] ); ...原创 2021-08-24 08:36:23 · 179 阅读 · 0 评论 -
C基础学习之C 指针的算术运算
目录递增一个指针递减一个指针指针的比较C 指针是一个用数值表示的地址。因此,您可以对指针执行算术运算。可以对指针进行四种算术运算:++、--、+、-。假设ptr是一个指向地址 1000 的整型指针,是一个 32 位的整数,让我们对该指针执行下列的算术运算:ptr++在执行完上述的运算之后,ptr将指向位置 1004,因为 ptr 每增加一次,它都将指向下一个整数位置,即当前位置往后移 4 字节。这个运算会在不影响内存位置中...原创 2021-08-23 08:42:46 · 218 阅读 · 0 评论 -
C基础学习之C 指针
C指针学习 C 语言的指针既简单又有趣。通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。所以,想要成为一名优秀的 C 程序员,学习指针是很有必要的。正如所知道的,每一个变量都有一个内存位置,每一个内存位置都定义了可使用&运算符访问的地址,它表示了在内存中的一个地址。请看下面的实例,它将输出定义的变量地址:#include <stdio.h> int main ()...原创 2021-08-19 09:36:14 · 183 阅读 · 0 评论 -
C基础学习之C 多维数组
目录C 多维数组二维数组初始化二维数组访问二维数组元素C 多维数组C 语言支持多维数组。多维数组声明的一般形式如下:type name[size1][size2]...[sizeN];例如,下面的声明创建了一个三维 5 . 10 . 4 整型数组:int threedim[5][10][4];二维数组多维数组最简单的形式是二维数组。一个二维数组,在本质上,是一个一维数组的列表。声明一个 x 行 y 列的二维整型数...原创 2021-07-24 16:40:58 · 156 阅读 · 1 评论 -
C基础学习之C 循环控制语句
目录break 语句continue 语句goto 语句break 语句C 语言中break语句有以下两种用法:当break语句出现在一个循环内时,循环会立即终止,且程序流将继续执行紧接着循环的下一条语句。 它可用于终止switch语句中的一个 case。如果使用的是嵌套循环(即一个循环内嵌套另一个循环),break 语句会停止执行最内层的循环,然后开始执行该块之后的下一行代码。C 语言中 break 语句的语法:break;...原创 2021-07-28 09:35:04 · 143 阅读 · 1 评论 -
C基础学习之C 循环方式
目录while 循环for 循环do...while 循环嵌套循环实例while 循环只要给定的条件为真,C 语言中的 while 循环语句会重复执行一个目标语句。C 语言中 while 循环的语法:while(condition){ statement(s);}在这里,statement(s)可以是一个单独的语句,也可以是几个语句组成的代码块。condition可以是任意的表达式,当为任意非零值时都为 ...原创 2021-07-26 08:51:02 · 335 阅读 · 2 评论