
C语言
文章平均质量分 53
一只有理想的程序猿
在嵌入式领域摸爬滚打的小菜鸟。
展开
-
一文搞懂C语言中位域
允许在一个结构体中以位为单位来指定其成员长度,这种以位为单位的结构体成员称为“位段”或者“位域”原创 2023-03-31 23:32:13 · 623 阅读 · 0 评论 -
嵌入式C宏定义特殊字符的用法
1 '#'运算符作为预处理运算符,可以把记号转化为字符串举例:#include <stdio.h>#define INT_TO_STR(n) #n#define VERSION(major, minor) "V"INT_TO_STR(major)"."INT_TO_STR(minor)#define ENUM_TO_STR(e) (#e)typedef enum{ USER_BUTTON_0 = 0, USER_BUTTON_1, USER_BUT原创 2022-05-30 11:28:35 · 258 阅读 · 0 评论 -
字符串 指针的使用误区
误区使用字符串误区,代码如下误区1:char *get_xx_version() { int file_handle = open("/xxx/xxx.txt",O_RDONLY); char *xxx = NULL; int err = read(file_handle,xxx,8); close(file_handle); log_ota("ver = %s\n",xxx); return xxx;}结果:ver = NULL原因:NUL原创 2022-04-23 17:19:20 · 346 阅读 · 0 评论 -
const修饰指针详解
文章目录前言1、const int* p = &a;2、int *const p = &a;3、const int* const p = &a;前言在阅读一些系统的源码时,经常会看到const修饰符,同时在面试中,const也是经常考到的点,因此在此总结下const的作用,并且是必须要掌握的。当用 const 进行修饰时,根据 const 位置的不同有三种效果。原则是:修饰谁,谁的内容就不可变,其他的都可变。这三种情况,在实际编程中经常用到。1、const int* p原创 2021-08-11 14:00:24 · 372 阅读 · 0 评论 -
volatile与指针
目录前言使用环境前言volatile ˈ/välədl/ 在嵌入式工作中经常会使用到,因此掌握volatile的使用非常重要。使用环境多任务环境下任务之间共享标志。寄存器映射的硬件寄存器原创 2021-07-28 09:39:59 · 2103 阅读 · 0 评论 -
C语言中的_FILE_, _LINE_的作用
1 FILE它是用来指定本行语句所在源文件的文件名,用法如下// 在test.c的一段代码,执行后,将输出打印test.c #include <stdio.h>int main (void){ printf(”%s“,_FILE_);}2 LINEC语言中的__LINE__用以指示本行语句在源文件中的位置信息,举例如下// 执行结果输出为4.1. #include <stdio.h>2. int main(void)3. {4. printf("%原创 2021-07-18 18:54:04 · 1404 阅读 · 0 评论 -
uthash用法总结
目录前言1、简单介绍C语言中的HashTable支持的操作复杂度非库文件2、用法结构体定义键值key的唯一性UT_hash_handle内存消耗结构体声明添加查询删除清空哈希表统计hash表中的已经存在的元素数遍历排序key为int类型的完整示例前言本文旨在总结介绍C开源hash项目。文章大部分内容均来自uthash的英文使用文档。官方源码uthash实现了常见的hash操作函数。使用uthash的代码时只需要包含头文件“uthash.h”即可。该套代码所有的实现都在uthash.h文件中,因此只需要原创 2021-07-13 16:15:21 · 2760 阅读 · 7 评论 -
别再说你不懂malloc()和calloc()的区别
1、参数个数上的区别malloc函数:malloc(size_t size)函数有一个参数,即要分配的内存空间的大小。calloc函数:calloc(size_t numElements,size_t sizeOfElement)有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小。2、初始化内存空间上的区别:malloc函数:不能初始化所分配的内存空间,在动态分配完内存后,里边数据是随机的垃圾数据。calloc函数:能初始化所分配的内存空间,在动态分配完内存后原创 2021-07-07 09:25:48 · 1188 阅读 · 0 评论 -
sprintf函数的运用
一、使用背景:需要通过SEGGER_RTT_printf打印温度传感器得到的温度值(浮点数),由于RTT函数不能打印浮点数。因此需要将浮点数转换成字符串,然后进行打印。 DP.Temp = SMBus_ReadTemp(); sprintf(MYBuff,"TEMP = %f\r\n",DP.Temp); SEGGER_RTT_printf(0,MYBuff); memset(MYBuff,0,sizeof(MYBuff));百度了下可以通过C语言的标准库函数将浮点数.原创 2020-11-09 16:01:31 · 708 阅读 · 0 评论 -
结构体二重指针的使用
今天看到结构体的二重指针的使用,有点迷糊,于是百度下,了解了。1、结构体的定义typedef struct Node{ int data; struct Node *Next;}Point_T,*Point_P;这里还需要理解下typedef的用法Node为结构体名。Point-T为结构体strcut Node的别名。*Point_P为结构体指针struct Node*的别名。2、结构体指针二层指针的使用。#include <stdio.h>...原创 2020-07-18 12:52:59 · 2574 阅读 · 0 评论 -
如何通过调用printf函数实现向串口发送数据
printf函数是标准的库函数,定义在stdio.h文件中。printf函数在keil的底层: 在keil中的标准C库中,printf、scanf等输入输出数据流函数是通过fputc、fgetc来实现最底层操作的,所以我们只需要在我们的工程中重定义这两个函数的功能就可以实现printf、scanf等数据流函数的重映射。因此看到通过printf函数向串口输出字节,一般会有如下fputc...原创 2020-03-19 15:56:56 · 2042 阅读 · 0 评论 -
Sprintf函数的作用
近期在浏览代码时,看到了sprintf函数,很疑惑。百度了,才知道这个函数功能很强大。sprintf()函数是标准库的函数,定义在stdio.h头文件中。代码如下:extern _ARMABI int sprintf(char * __restrict /*s*/, const char * __restrict /*format*/, ...) __attribute__((__non...原创 2020-03-19 15:38:03 · 1530 阅读 · 1 评论 -
C语言一行写不下,该不该换行
C语言一行写不下,可不可直接换行,要分两种情况:1、预处理一行写不下:把一个预处理指示写成多行需要加换行符“\"续行,因为根据定义一条预处理指令只能由一行逻辑代码构成。2、正常程序一行写不下:把C代码写成多行则不必使用续行符,因为换行在C代码中只不过是一种空白字符,在做语法解析时所有空白字符都被丢弃了。#include <stdio.h>#define PI (...转载 2019-11-11 10:12:29 · 10824 阅读 · 0 评论 -
指针和常量,坐值和右值
指针和常量的误区假定变量a的存储地址是100,那么表达式:*100=25;代表的含义是什么?如果认为代表的含义是a=25,那就错误了。这句话本身是非法的。因为100属于整型,而间接访问操作符只能访问指针类型的表达式。如果操作者确实想把25存储于位置100,那么应该进行强制类型转换,*(int *)100=25;强制类型转化把值100从 “整型”强制转化为了 “指向整型类型的指针”这样对它进行简...原创 2019-04-21 22:27:29 · 349 阅读 · 0 评论 -
如何方便快速的将一个float类型的数据转化为char类型从而通关串口将其发送出去
在工作中遇到一个问题,计算出了一个float类型的数据,然而和上位机的通信协议是按照字节一个个发送出去的。刚开始的想法是使用移位的方法,将float类型的数据存储到字符串数组中去。现在可以使用联合体将数据方便快速的转化为单个字节,从而发送出去。定义一个联合体如下:union energy_test{char separate[4];float i;}void main(){ ...原创 2019-04-15 18:26:39 · 1724 阅读 · 0 评论 -
对volatile类型修饰符的理解
1.volatile和const相同都属于类型修饰符,但是两者是对立的。volatile表示修饰的变量可能会被后台程序改变,这种改变是未知的。变量如果加了volatile修饰,每次对变量进行读取操作时都是从内存中去加载变量的内容,而不是从寄存器中拷贝内容。举个栗子:void main(void){ int a,b; int i=10; a=i; b=i;}//在这个a=i...原创 2018-04-12 16:01:59 · 767 阅读 · 0 评论 -
C语言中的内联函数
在函数中调用另外一个函数时,会存在函数的入栈和出栈的操作,引用内联函数的作用是当函数被调用时,直接将函数名替换为函数体,因此就不存在函数入栈和出栈的操作,从而调高了程序的执行效率。弊端是增加了目标代码量,增加了空间的开销。因此它是牺牲空间来换取时间的节省。内联函数类似宏操作,但是和宏替换也是有不同之处的:1、宏替换只是单纯的替换不进行类型检查。2、宏替换不能使用return 返回。内联函数一般是简...原创 2018-05-10 16:53:20 · 571 阅读 · 0 评论 -
extern “C++”的用法
在c语言头文件中看到类似下面的代码:这样写的目的是为了能够让C与CPP实现接口,而采用的一种语法形式,告诉编译器这部分代码是按照C++语言的格式进行编译和链接的,而不是C。C和C++编译和链接的区别:C++支持函数重载,而C是不支持的。拿一个函数原型void one(int i,int j);举个例子。该函数在C编译器编译后在符号库中的名字为:_one,而C++编译器在编译后会产生类似_one_i...原创 2018-05-10 17:31:55 · 3199 阅读 · 0 评论 -
关于引用的一些常见知识点汇总
1、什么是引用:引用就是某个目标变量的“别名”(alias),对引用的操作与对变量直接操作效果完全相同。声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。不能建立数组的引用。引用是C++提出的一种使用变量的方式,即给变量起个别名。通过这个别名来操控实际的变量。在C中不支持变量的引用。...原创 2018-10-25 16:09:55 · 481 阅读 · 0 评论 -
C语言笔试题之有关内存的思考
转载: void GetMemory(char *p) { p = (char *)malloc(100); } void Test(void) { char *str = NULL; GetMemory(str); strcpy(str, "hello world"); printf(str); } 请问运行 T...转载 2018-12-06 20:47:20 · 517 阅读 · 0 评论 -
C语言笔试题之原码反码补码的概念及运算
这种题目目的是考察计算机基础知识是否扎实。一. 机器数和真值在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.1、机器数一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 100000...转载 2018-12-06 21:36:25 · 2670 阅读 · 1 评论 -
C语言笔试题之递归的运用
写一个程序,以递归的方式反序输出一个字符串。#include<stdio.h>void reverse(char *p){ if(*p=='\0') return; reverse(p+1); printf("%c",p);}用递归的方式计算n的阶乘。long func(int n){ if(n=...原创 2018-12-07 12:47:20 · 387 阅读 · 0 评论 -
两个c语言笔试题目
1、将一个字符串转化为一个整形数据int main(char *str)char *p = str;int n,i;{ /* while (*p++ != '\0') { n++; //计算字符串的长度,不包括字符串结束符,此步骤可以没有 } */ while (*str){ i = i*10; i = i + *str - ...原创 2019-02-25 21:25:16 · 200 阅读 · 0 评论 -
结构体型二维数组的传递及运算
实际工作中遇到的关于结构体型二维数组的疑问点及BUG现在总结如下:定义一个结构体:typedef struct energyandvol{ float a0; float b0; float c0; }CALIPARAM;static CALIPARAM CaliParam[11][2...原创 2019-03-22 13:31:15 · 2614 阅读 · 0 评论 -
再论sizeof 和strlen的区别
我们能常在用到sizeof和strlen的时候,通常是计算字符串数组的长度从这个例子可以看得很清楚两者的区别:char str[20]="0123456789";int a=strlen(str); //a=10; >>>> strlen计算字符串的长度,以结束符0x00为字符串结束。int b=sizeof(str); //而b=20; &g...原创 2019-03-28 14:53:48 · 129 阅读 · 0 评论 -
如何在位置100的地方存储值为25的整型数呢?
前几天被一个同学开玩笑的问如何在位置100的地方存储值为25的整型数呢?*100=25???非法的。字面值100属于整型类型,而间接访问操作只能作用于指针类型表达式。如果确实想把25存储在100的位置,那么需要强制类型转换把100从整型转换为指向整型的指针。即*(int *)100=25;我们很少这样使用这种技巧,当使用到系统与一些输入输出设备的控制器进行通信时,通过固定的内存地址中读取和写入值来...翻译 2018-03-15 20:59:46 · 181 阅读 · 0 评论