C
RiverFormSky
这个作者很懒,什么都没留下…
展开
-
【GIT】github的图片无法显示解决办法
把DNS服务器地址改成:223.5.5.5和 223.6.6.6原创 2022-05-09 09:28:38 · 439 阅读 · 0 评论 -
【C语言】冒泡排序法
#include <stdio.h>int main(){ int i, j, k, temp; int buffer[3] = {3,2,1}; /* 要求: 将数组按照从小到大的顺序进行排序 思路: 从第一个数开始,将每一个数和相邻的数进行比较,如果这个数比后一个数大,就交换他们的位置 第一轮排序就能选出最大的数,并且将它放在最后一个位置 第二轮排序就能选出第二大的数,并将它放在倒数第二个位置,这样从倒数第二个位置开始就是排序好的数 以此类推,直原创 2022-01-06 15:29:06 · 614 阅读 · 0 评论 -
【C语言】二级指针的实例
#include "stdio.h"#include "stdlib.h"/* 示例1:通过二级指针在函数内部进行内存分配 */ void malloc_fun(int **p2){ *p2 = malloc(1);}void malloc_p1_test(void){ int *p1 = NULL; printf("示例1:通过二级指针在函数内部进行内存分配\r\n"); malloc_fun(&p1); if( p1 == NULL ) { prin原创 2021-10-15 17:25:57 · 1255 阅读 · 0 评论 -
【C语言】二级指针分析
假设有这样一段代码,p2指向p1,p1指向a,a就是一个普通的整型变量,a的值为100。void main(void){ int a = 100; int *p1 = &a; int **p2 = &p1;}假设a的地址为0x0000,p1的地址为0x0004,p2的地址为0x0008,那么就有这样一个表。变量p2p1a值0x00040x0000a地址0x00080x00040x0000对一级指针p1取值,就是*p1=*(0x原创 2021-10-15 14:30:38 · 584 阅读 · 0 评论 -
【C语言】数组和链表结合实现内存池管理
#pragma pack(1)typedef struct TAG_INFO{ S_Time time; uint32_t sys_sec; uint8_t fin; uint8_t type; uint8_t freq; uint8_t ant; uint8_t rssi; uint8_t id[24];}S_TAG_INFO, *P_TAG_INFO; typedef struct TAG_NODE{ S_TAG_INFO tag; struct TAG_NODE *原创 2021-04-10 23:55:27 · 342 阅读 · 1 评论 -
【C语言】简单的环形缓冲区
写个简单的环形FIFO,相比于用读写位置去判断缓冲区空和满的方式,下面的实现方式会比较容易理解,毕竟代码是给人看的。#define MAX_FIFO_BYTE 1024typedef struct{ __IO uint32_t write; __IO uint32_t read; __IO uint32_t count; uint8_t data[MAX_FIFO_BYTE];}S_FIFO, *P_FIFO;static S_FIFO g_fifo = {0};voi原创 2021-04-06 16:12:04 · 270 阅读 · 0 评论 -
【C语言】以指针作为实参的问题
以指针作为实参时,实参p传递给形参p1的其实是p的拷贝,所以在局部函数中改变形参p1的指向对身处主函数的p是无影响的,但是因为p1是p的拷贝。所以他们的指向是相同的,所以可以通过p1修改了那块内存的值。如果实参p的指向为空,也就是说p是一个空指针的话,那么它就没有指向某块内存。形参也就无法操作p所指向的内存了(因为p本就没有指向任何一块内存),即使p1在局部函数中指向了一个malloc的空间。这其实是改变了p1的指向(从NULL到指向malloc的空间),但是如前所述,p1只是p的拷贝,改变副本的指向转载 2020-11-10 09:17:59 · 762 阅读 · 0 评论 -
【C语言】自动类型转换规则
#include <stdio.h>int main(){ /* 自动类型转换规则如下: */ /* 1、参与运算的类型不同,则先转换为同一类型 */ /* 2、两种类型字节数不同,转换为高字节数的类型 */ /* 3、转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。 */ /* 4、若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型 */ /* 5、所有的浮点运算都是以双精度进行的,即使仅原创 2020-09-04 22:45:00 · 1901 阅读 · 0 评论 -
【C语言】使用printf宏定义打印调试日志
/* 取消其它文件的__DEBUG宏定义,避免文件之间的调试功能相互干扰 */#undef __DEBUG/* 调试开关,定义__DEBUG表示打开该文件的调试功能 */#define __DEBUG#ifdef __DEBUG#define DEBUG(fmt, args...) printf("====> %s(%d):%s "#fmt"\r\n", __FILE__, __LINE__, __func__, ##args)#else#define DEBUG(fmt原创 2020-07-28 11:09:58 · 1204 阅读 · 1 评论 -
【C语言】字符串和数字之前相互转换
常用的函数都可以在菜鸟教程中快速搜索到,可以在里面看到具体的用法。sprintf函数该函数用于将数字格式化为字符串sccanf函数该函数用于从格式化的字符串中提取数字举例#include <stdio.h>int main(){ unsigned char str[100]; unsigned char ip[4]; /* 将数字格式化为字符串 */ sprintf(str, "%d.%d.%d.%d", 192, 168, 0, 1); printf("%s原创 2020-07-22 10:00:11 · 204 阅读 · 0 评论 -
【C语言】对有符号数和无符号数的理解
提出问题如果在计算机的内存种存放了二进制1000 0000,它代表的值究竟是多少?基础概念1、原码、反码、补码正数的原码=补码=反码,例如:对于十进制数128,它的原码、反码、补码分别是原码:1000 0000反码:1000 0000补码:1000 0000负数的原码等于它本身,反码等于原码按位取反,补码等于反码+1,例如:对于十进制数128,它的原码、反码、补码分别是原码:1000 0000反码:0111 1111补码:1000 00002、数据在内存的存放形式需要明确知道,原创 2020-07-02 00:47:56 · 1404 阅读 · 0 评论 -
【C语言】UTC时间转换为北京时间
最近使用GPS模块获取解析GPRMC数据的时候,获取到的是UTC时间,需要转换为北京时间,网上看了一些文章,发现存在一些问题,于是自己完善了一下,并做了注释,方便理解。typedef struct { uint16_t year; //年份 uint8_t month; //月份 uint8_t date; //日期 uint8_t hour; //小时 uint8_t min; //分钟 uint8_t sec; //秒钟}*p_nmea_time,原创 2020-07-01 10:31:59 · 4955 阅读 · 3 评论 -
【C语言】在不同数据类型之间进行移位运算
今天发现一个挺久以来一直没有留意的知识盲区,直接上代码:#include <stdio.h>int main () { unsigned char a = 1; unsigned short b = 0; b = a << 8;/* a只有8位,按照运算符的优先级,先进行<<运算,左移以后a=0,然后赋值给b,b应该也等于0,不是吗? */ ...原创 2020-03-12 11:00:38 · 1003 阅读 · 0 评论