
c语言
modi000
生命不止,奋斗不息!
展开
-
【C++】DLL和LIB的含义及使用场景和区别
导入库:用于支持动态链接库(DLL)的引用,它仅存储 DLL 的函数导出信息,而不包含实际代码实现。DLL 文件是动态链接库,扩展名为 .dll,用于在程序运行时动态加载和调用其中的代码或函数。静态库会在编译时直接嵌入到程序中,因此生成的可执行文件较大,但独立性强,不依赖外部文件。DLL(动态链接库) 适合模块化、插件式开发和共享资源,更新维护方便,但依赖运行时环境。LIB(静态库或导入库) 适合独立应用,无需运行时依赖,但更新时需要重新编译整个程序。在运行时加载,按需使用,节省内存和磁盘空间。转载 2024-12-30 16:14:49 · 316 阅读 · 0 评论 -
『算法』哨兵查找算法
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。然后,我们从后向前查找,如果和目标值相同,则结束循环,否则向前走。当下标为0时,会结束循环,因为0号下标是目标值;本篇博客介绍一下哨兵查找算法,哨兵查找算法是对顺序查找的一个优化。如果不同,则我们将0号下标元素先保存起来,然后将目标值放到0号下标处;最后判断index是否大于0,如果大于0表示找到了,否则就是没找到。首先,判断0号下标元素是否和目标值相同,如果相同,直接返回0;上述程序是一个典型的。转载 2024-04-09 09:53:25 · 84 阅读 · 0 评论 -
递归的个人总结
func3函数返回了,继续执行func2中的语句;func2执行完了,继续执行func1之后的语句;从上图中可以看出,最后调用的函数先执行完(也是递归中回归的过程),即:this is func3先打印输出。可以按照如下来理解:func1中调用func2,func2中调用func3;递归函数(递去、回归)是函数不断的调用自己;原创 2024-03-22 13:03:58 · 580 阅读 · 0 评论 -
或运算的理解
p || j>i) 还添加了 j>i ,其实while推出循环后,是不存在j>i的情况,之所以要加这个条件,是因为要排除没进while循环的情况,j=1,j>i 即排除了i原创 2024-03-08 11:18:33 · 640 阅读 · 0 评论 -
变参函数的说明
变参函数的中的不确定的参数,填还是不填,或填什么值,取决于cmd.即:变参的类型和个数取决于最后一个固参。原创 2024-02-25 15:59:13 · 336 阅读 · 0 评论 -
指针作为传入传出参数
总结:形参为指针的情况,实参类型一般为指向的数据类型。指针前有const,认为是是传入参数;原创 2024-02-24 23:02:34 · 544 阅读 · 0 评论 -
C语言回调函数详解(全网最全)
如上述代码:可以看到,Handle()函数里面的参数是一个指针,在main()函数里调用Handle()函数的时候,给它传入了函数Callback_1()/Callback_2()/Callback_3()的函数名,这时候的函数名就是对应函数的指针,也就是说,回调函数其实就是函数指针的一种用法。结合这幅图和上面对回调函数的解释,我们可以发现,要实现回调函数,最关键的一点就是要将函数的指针传递给一个函数(上图中是库函数),然后这个函数就可以通过这个指针来调用回调函数了。转载 2024-02-24 21:01:24 · 2108 阅读 · 0 评论 -
new/delete 和malloc/free的区别
小结:C语言中,申请了多个内存空间,也是只用free即可。原创 2023-11-20 22:11:08 · 201 阅读 · 0 评论 -
函数指针和指针函数用法和区别
函数指针,其本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。声明格式:类型说明符 (*函数名) (参数)函数指针是需要把一个函数的地址赋值给它,有两种写法:取地址运算符&不是必需的,因为一个函数标识符就表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。x = fun();两种方式均可,其中第二种看上去和普通的函数调用没啥区别,如果可以的话,建议使用第一种,因为可以清楚的指明这是通过指针的方式来调用函数。转载 2023-10-18 13:21:23 · 76 阅读 · 0 评论 -
两个指向同一个字符串常量的指针
是不是很奇怪,原因是这是在Debug调试版本下的运行结果,此时创建的两个指针,虽然均指向的是a的地址,但是他们的自身的地址不一样,所以不相等。事实上,为了节省空间(可以节省一个指针大小的空间),系统会进行优化,让两个指针指向相同的同时存放地址也相同,即相等。版权声明:本文为优快云博主「__CFeng」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.youkuaiyun.com/hfeng1_/article/details/126525878。转载 2023-10-10 16:24:07 · 127 阅读 · 0 评论 -
补码的最终理解
如上例所示,实际中,我们只会使用50至99表示-50至-1的补码,空出1-49。让计算机做加法,故将减法(负数)转换成加法(正数),转换后结果求和结果不变。先移项:xxxx xxxx = 0000 0000-0010 1101,可得出:xxxx xxxx = (借位 1) 1101 0011,其中的:xxxx xxxx,就是【-45 的八位补码】。实际上,任意负数(-X)的补码,都是:0 - X。同理,任意正数(+X)的补码,也都是:0 + X。其实,补码的原理,与 “取反加一” 毫无关系。原创 2023-09-11 21:23:30 · 350 阅读 · 0 评论 -
*(p++)的理解
/相当于*p=i+j;什么时候++呢,是这条语句执行完,再执行++;所以,相当于*p=i+j;该条语句括号可以省略。原创 2023-07-25 16:10:19 · 1148 阅读 · 0 评论 -
用指针访问二维数组
前言如何理解二维数组?我们以二维的方式理解二维数组,他在存储时却是一维的。用指针访问二位数组例:int a[3] [4] = {1,3,5,7,9,11,13,15,17,19,21,23};我们想象的二维数组的存储方式:3行4列a[0] [0]a[0] [1]a[0] [2]a[0] [3]a[1] [0]a[1] [1]a[1] [2]a[1] [3]a[2] [0]a[2] [1]a[2] [2]a[2] [3]转载 2023-07-25 14:24:45 · 1649 阅读 · 0 评论 -
一道二维数组运算题
【代码】一道二维数组运算题。原创 2023-07-25 11:43:29 · 109 阅读 · 0 评论 -
补码练习题
20补码:-20 = -1-19, 0xFF-0x13=0xEC 或者 0xFF+ 0xED =0x 1 EC 或者 -20+256=236.-123 = 0x80+0x5 = 0x85 或者 -123+256 = 133。-100 =0x80+0x1c=0x9c 或者 -100+256 = 156。-17补码:-17 =-1-16 , 0xEF,-128补码:0x80,-1补码:0xFF,原创 2023-06-28 22:03:11 · 517 阅读 · 0 评论 -
补码究竟是什么?
有了同余这个机制,无论是无符号数还是有符号数,计算机都可以使用相同的规则进行计算,同样的二进制输入,肯定会得到同样的计算结果,把计算结果看作是无符号还是有符号,计算机是不管的,是由我们说了算。补码的本质:找到一个替代负数(-3)的正数(253),并用此正数的二进制形式参与运算,进行加法运算后,将得到的结果中溢出的数字舍去后,只读取结果中固定位数(此处是 8 位)的二进制数作为运算的结果。计算机以二进制补码的形式存储整数,最高位是符号位,0 表示正数,1 表示负数,其余位为数字位。转载 2023-06-26 11:16:09 · 7335 阅读 · 2 评论 -
生成多项式
生成多项式就是用来把要进行防错处理的二进制码流进行转换生成校验码,然后接收方会收到原始的二进制码流和校验码,按照与发送方相同的多项式再次进行转换生成校验码,与发来的校验码进行比较。3、用生成多项式(二进制数)对信息码做除,得到R位的余数(注意:这里的二进制做除法得到的余数其实是模2除法得到的余数,并不等于其对应十进制数做除法得到的余数)。1、将X的最高次幂为R的生成多项式G(X)转换成对应的R+1位二进制数。4、将余数拼到信息码左移后空出的位置,得到完整的CRC码。求使用CRC后最终发送的信息码。转载 2022-10-14 14:25:54 · 7561 阅读 · 1 评论 -
#if预编译的应用
我们看到,可以通过预编译的方式,来选择性的改变代码的运行。原创 2022-09-28 15:16:44 · 225 阅读 · 0 评论 -
移位运算举例
/左移一位相当于乘以2。总结:在从char[] 转换为int的过程中,我们并没有考虑字节序,即:我们并不需要考虑他在内存中是如何存储的。将该字符数组拼接为一个int值。原创 2022-09-28 11:15:10 · 274 阅读 · 0 评论 -
sscanf的用法
sscanf()会将参数str的字符串根据参数format字符串来转换格式并格式化数据。转换后的结果存于对应的参数内。sscanf和scanf的区别:scanf是以键盘作为输入源,sscanf是以字符串作为输入源。7. 取仅包含指定字符集的字符串。(取仅包含数字和小写字母的字符串,是取得连续的字符串)。利用它可以从字符串中取出整数、浮点数和字符串。5. 取到指定字符为止的字符串。如例子所示,遇到‘+’为止的字符串。6. 取到指定字符集为止的字符串。如遇到小写字母为止的字符串。1. 取指定长度的字符串。转载 2022-09-15 10:50:20 · 326 阅读 · 0 评论 -
C语言%d、%c与%hhd的区别,%p与%x的区别
尽管目前32位平台上的指针一般全是32位的,但旧的一些平台上可能有多种长度的指针)格式控制符“%p”中的p是pointer(指针)的缩写。指针的值是语言实现(编译程序)相关的,但几乎所有实现中,指针的值都是一个表示地址空间中某个存储器单元的整数。问题1:C语言%d与%hhd的区别,二 者在什么时候不能替换使用(什么时候替换使用后输出内容不同)?1.printf(("%%d)=%d", a), 这里%% 可以输出%不过%c在输入输出的时候,是按照字符操作的。问题3:C语言中 %p的含义,与%x的区别。转载 2022-09-15 09:11:10 · 4797 阅读 · 0 评论 -
C程序出现段错误
原因是int a=4000;printf("a=%s",a);a是个int型变量,使用%s输出打印,越限了。原创 2022-07-07 10:46:37 · 222 阅读 · 0 评论 -
#ifdef的应用
参考该文通常用来做代码注释,可以做选择的注释;而且,因为是预编译,不执行的代码不会被编译,执行文件小。原创 2022-06-09 15:38:19 · 155 阅读 · 0 评论 -
C/C++中常见的#if、if、#ifdef、#if define等区别
条件编译是C语言中预处理部分的内容,它是编译器编译代码时最先处理的部分,条件编译里面有判断语句,比如 #if 、#else 、#elif 及 #endif它的意思是如果宏条件符合,编译器就编译这段代码,否则,编译器就忽略这段代码而不编译,如而 if 语句则不然,if 是 C 语言中的关键字,它根据表达式的计算结果来觉定执行那个语句,它里面的每个分支都编译了的, 如作为一个编译“开关”(常用来注释代码),比如:假如编译时,确实满足条件(结果非0时),则生成的程序文件(.exe文件)中不会有执转载 2022-06-09 15:35:23 · 6915 阅读 · 0 评论 -
ifdef的用法
http://blog.21ic.com/user1/2663/archives/2009/65325.html 转载: ifdef的用法_liang890319的博客-优快云博客_ifdef的用法转载 2022-06-09 15:27:31 · 20720 阅读 · 1 评论 -
warning: cast from ‘void*’ to ‘int’ loses precision [-fpermissive] 错误分析
转载:warning: cast from ‘void*’ to ‘int’ loses precision [-fpermissive] 错误分析_虚渊玄的博客-优快云博客这种错误一般产生在linux 64位机上因为linux64 上的int为 4个字节指针为 8个字节int num = 100;//此时不会产生错误,但会产生警告,因为4字节的转换为8字节void* p = (void*) num; //此时就会产生错误,因为8字节的指针被强转为4字节的int,数据丢失了转载 2022-04-29 11:05:20 · 1670 阅读 · 0 评论 -
C语言中延时器算法(定时器算法)
参考下文:c语言中计数器(定时器)程序_modi000的博客-优快云博客_c语言计数器工作中经常会用到延时器情形是:满足某一条件后,开始定时//在10ms中断函数中的判断int timer = 0;if(A!=B){ timer = 100; A = B;}else{ if(timer == 0) { //do sth. }else{ timer--;}}...原创 2022-04-28 16:31:57 · 2783 阅读 · 0 评论 -
Linux中getopt函数、optind等变量使用详解
getopt函数、optind等变量使用详解最近在学习《Unix网络编程》vol2时,发现书中例子经常使用一个命令行解析getopt函数,因为函数声明比较特别,根据自己摸索,遂总结出使用方法。1. getopt函数的声明该函数是由Unix标准库提供的函数,查看命令man 3 getopt#include <unistd.h>int getopt(int argc, char * const argv[], const char *optstring);extern char转载 2022-04-25 16:50:49 · 759 阅读 · 0 评论 -
C语言中getopt()函数的用法
1.getopt()函数getopt函数用来解析命令行选项,声明所在头文件为:#include <unistd.h>1函数原型如下:int getopt(int argc, char * const argv[], const char *optstring);1第一个参数argc是参数个数,和main函数的argc一样;第二个参数argv是字符串指针,和main函数的argv一样;第三个参数 optstring 是选项字符串,是本文所要讲述的重点。2. optst转载 2022-04-25 15:59:17 · 1864 阅读 · 0 评论 -
fopen打开失败后使用fclose
linux系统下,发现使用fopen打开文件失败后,会出现段错误的情况。原创 2022-04-18 10:29:23 · 893 阅读 · 2 评论 -
c语言程序控制第一次执行
方法一:通过置标志位来区分。方法二:设置某个int value = -1;if(value == -1)value = 1;这样区分第一次。原创 2022-03-04 14:15:18 · 585 阅读 · 0 评论 -
中断函数注意事项
中断函数里是不能写占用时间长的代码的,比方说存录波文件。此时,可以通过发消息的形式,给另一个线程来存储。原创 2022-03-04 10:06:37 · 799 阅读 · 0 评论 -
char类型数据的透彻理解
char数据类型可以完全等价与 int8_t;也就是说,char类型中存的就是一个8位的整型。char test = 24;char ch[2] = {1,2};int8_t value = ch[0];ch[1] = 30;char 类型的特殊之处是,形式上可以存储字符类型,但实质上存的还是字符的ascii码值。char ch[2] = {1,2,'a','1'};int8_t value_0 = ch[0]; //1int8_t value_1 = ch[1]; /...原创 2022-02-24 18:11:34 · 1088 阅读 · 0 评论 -
指针数组初始化的应用
int *ch[2];情形1:ch[1] = new int;ch[2] = new int;情形2:ch[1] = new int [10];ch[2] = new int [10];总结:指针既可以指向一个普通变量,也可以指向一个数组。原创 2022-02-23 10:38:48 · 421 阅读 · 0 评论 -
判断文件是否存在
fopen("filename",rb+)以读的形式打开文件,如果打不开,则不存在。原创 2022-02-23 09:54:47 · 311 阅读 · 0 评论 -
程序中多个变量不知道先后变化顺序的判断方法
程序中,我们会碰到,A、B两个变量在相近的时刻都可能发生变化,但是具体是哪个变量先变化不得而知,但我们在后期判断的时候,又必须明晰A变量变化前提下,判断B变量的变化情况。1、方法0)将ABC的值都保存;1)将这AB组成一个字节变量C,只要是这个字节变量C发生变化,我们就获知AB肯定发生了变化(不管是A变了还是B变了);2)开启定时器,等待另一个变量的变化结束(加入另一个量发生了变化),同时,置同C变量的值;3)待A和B均变化结束后,判断是A变了,还是B变了。4)置同A和B变量前后的值原创 2022-02-16 09:12:37 · 1247 阅读 · 0 评论 -
c语言中使用死循环控制程序走向
void myfunc(){ for(;;) { int value1 = func1(); if(value1 == -1) break; int value2 = func2(); if(value2 == -1) break; break; } func3();}上述程序中的利用死循环中的break属性.原创 2022-02-11 09:42:41 · 601 阅读 · 0 评论 -
如何判断文件是否读到文件结尾
二进制文件:头文件:#include#define feof(_stream) ((_stream)->_flag & _IOEOF)feof()函数用来检测当前文件流上的文件结束标识,判断是否读到了文件结尾,其原型为:int feof(FILE * stream);【参数】stream为文件流指针。【返回值】检测到文件结束标识返回1,否则返回0。文件结束标识一般由上次的读写操作来设置,当然也可以手动设置。当文件内部的位置指针指向文件结束时,并不会立即设置...转载 2022-02-09 09:06:15 · 4721 阅读 · 0 评论 -
二维数组的赋值及初始化
例1:int aa[3][2]={ {1,2}, {3,4}, {5,6} };printf("%d\n",aa[0][0]);例2:char bb[3][4]={ "ni", "wo", "ta" };printf("%s\n",bb[0]);注意:二维数组名解引用才是一维数组名,才是指原创 2022-02-08 08:53:14 · 2800 阅读 · 0 评论 -
#if 0
我们在c语言编程中,经常会用到#if 0//代码#endif用来屏蔽某段代码。原创 2022-02-07 14:35:35 · 397 阅读 · 0 评论