
C语言
文章平均质量分 53
恋天的风
这个作者很懒,什么都没留下…
展开
-
C语言中使用指针修改const的值
#include <stdio.h>int main(){ const int a=10; //若const a=10,编译器也会默认为a是int类型的 int *P=(int*)&a; //注意需要强制&a前需要加int*类型强制类型转换 *P=12; printf("a=%d\n",a); return 0;}结果:a=12...原创 2019-03-15 00:14:51 · 2885 阅读 · 6 评论 -
./ 当前目录 ../ 父级目录 / 根目录
./当前目录../ 父级目录/ 根目录原创 2019-03-12 09:54:47 · 3106 阅读 · 0 评论 -
STRUCT_OFFSET( s, m )宏
#define STRUCT_OFFSET( s, m ) ( (UINT8)( & ((s *)0) -> m ) ) /* 定义获取结构成员相对偏移地址的宏 */如上宏的意义,获取结构体S中元素M,相对于首元素的偏移量。#include <stdio.h>#define STRUCT_OFFSET(s,m) ( (int)(&...原创 2019-03-11 15:52:04 · 840 阅读 · 0 评论 -
指针常量和常量指针
指针常量指针常量:顾名思义它就是一个常量,但是是指针修饰的。格式为:int * const p //指针常量在这个例子下定义以下代码:int a,b;int * const p=&a //指针常量//那么分为一下两种操作*p=9;//操作成功p=&b;//操作错误因为声明了指针常量,说明指针变量不允许修改。如同次指针指向一个地址该地址不能被修改,但是...转载 2019-03-09 00:11:57 · 119 阅读 · 0 评论 -
STM32中的断言
#ifdef USE_FULL_ASSERT/** * @brief The assert_param macro is used for function's parameters check. * @param expr: If expr is false, it calls assert_failed function which reports * ...转载 2019-03-08 18:31:49 · 423 阅读 · 0 评论 -
C语言 枚举enum、宏定义#define、结构体struct的一种联合应用
#include <stdio.h>typedef enum ENUMDATE{ first=0x01, second=0x02, third=0x03}enumdate;//宏跨行,需要用续行符#define DATEDE \ { \ first, \ second, \ third \} ...原创 2019-03-08 17:48:13 · 621 阅读 · 0 评论 -
C/C++中#define宏定义的作用域
#include <iostream>using namespace std;void t(void){ #define a 10}int main(){ cout << a<<endl; return 0;}如上代码编译,打印输出结果为10。由此可见#define的作用域是文件作用域,在定义之后的位置使用都有效。改变其...原创 2019-03-08 15:47:53 · 2872 阅读 · 0 评论 -
嵌入式软件工程师经典面试题
1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL1我在这想看到几件事情:1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出...转载 2019-03-04 19:42:24 · 1285 阅读 · 0 评论 -
面试题:最常见最有可能考到的C语言面试题汇总
1. 用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#defineSECONDS_PER_YEAR (60 * 60 * 24 * 365)UL(无符号长整型)2. 写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。#defineMIN(A,B) ((A) <= (B)? (A) : (B))4. 嵌入式系统中经常要用到无限循环...转载 2019-03-04 11:43:16 · 508 阅读 · 0 评论 -
C语言逗号表达式
c语言提供一种特殊的运算符,逗号运算符,优先级别最低,它将两式联接起来,如:(3+5,6+8)称为逗号表达式,其求解过程先表达式1,后表达式2,整个表达式值是表达式2的值,如:(3+5,6+8)的值是14,(a=3*5,a*4)的值是60,原因在于赋值运算优先级高于逗号表达式。逗号表达式的要领:1.从左到右逐个计算;2.逗号表达式作为一个整体,它的值为最后一个表达式的值;3.逗号...转载 2019-03-04 11:24:36 · 896 阅读 · 1 评论 -
函数可重入性及编写规范
一、可重入函数1)什么是可重入性?可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误。相反, 不可重入(non-reentrant)函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断)。可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据。2)可...转载 2019-03-03 21:50:36 · 714 阅读 · 0 评论 -
int int*分别占多少字节
先说指针,指针不同于普通变量,存的是地址,指针的范围只和机器字和系统有关在32位系统中,所有指针都是4B(0x00000000~0xFFFFFFFF)在64位系统中,所有指针都是8Bchar 1Bint 4B(16位机为2B)Float 4double 8...转载 2019-03-03 20:18:03 · 3572 阅读 · 0 评论 -
C语言面试题
1.请问这种定义结构体正确吗?如果有问题,问题在哪儿。struct a { int x; char y; struct a z; struct a *p;}答:错误有两点。1.不能在结构体声明中定义结构体变量(struct a z);2.}后面没有加分号(;).以下为正确做法。struct a { int x; char y;...原创 2019-03-03 19:53:37 · 304 阅读 · 0 评论 -
typedef struct 指针
#include <stdio.h>int main(){ typedef struct std { char name[10]; int year; }Std,*pStd; Std s1={"li ming",2019}; pStd p1; p1=&s1; printf("s1.na...原创 2019-02-27 14:41:56 · 1482 阅读 · 0 评论 -
含数字的字符('0','1','2','3','4','5','6','7','8','9')转数字(1,2,3,4,5,6,7,8,9)
#define CharToNumber(x) (x-'0')原创 2019-02-20 18:51:48 · 2783 阅读 · 0 评论 -
数组相关概念
#include <stdio.h>int main(){ int a[5]={1,2,3,4,5}; printf("&a[0]=%d\n",&a[0]); printf("&a=%d\n",&a); printf("&a[0]+1=%d\n",&a[0]+1); printf(&qu原创 2019-02-20 09:52:32 · 143 阅读 · 0 评论 -
数组指针和指针数组的区别
数组指针和指针数组的区别数组指针(也称行指针)定义 int (*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。如要将二维数组赋给一指针,应这样赋值:int a[3][4];int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a...转载 2019-02-20 09:33:42 · 135 阅读 · 0 评论 -
字符串指针数组
#include <stdio.h>const char *CommandList[4] = { "help", "version", "bitXXX", "error"};int i;in...原创 2019-02-19 10:44:15 · 164 阅读 · 0 评论 -
C语言中存储多个字符串的两种方式
C语言中存储多个字符串的两种方式方式一 二维字符串数组声明:char name[4][10] = { "Justinian", "Momo", "Becky", "Bush" };在内存中的存储:J u s t i n i a n \0 M o m o \0 \0 \0 ...转载 2019-02-19 09:59:35 · 13201 阅读 · 0 评论 -
C语言实现大小写字符转换
问题描述: 输入一串字符串,将其中的大写字母换成小写,小写字母换成大写输出。 例如: 输入:ASDFGHJzxcvb 输出:asdfghjZXCVB解题思路: 将一个小写字符转换成大写字符,只需要将这个字符减去32;将一个大写字符转换成小写字符,则给这个字符加上32;代码实现:#include<stdio.h>int main(){ while (1)...转载 2019-02-19 09:38:59 · 8588 阅读 · 0 评论 -
(深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)
(深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack) bss段: bss段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。 bss是英文Block Started by Symbol的简称。 bss段属于静态内存分配。 data段: 数据段(data segment)通常是指用来存放...转载 2019-01-22 17:36:42 · 349 阅读 · 0 评论 -
CRC16 C语言实现
#include <stdio.h> void InvertUint8(unsigned char *dBuf,unsigned char *srcBuf){int i;unsigned char tmp[4];tmp[0] = 0;for (i=0; i< 8; i++) {if (srcBuf[0]& (1 << i))...原创 2019-01-16 11:02:18 · 1497 阅读 · 0 评论 -
error: stray ‘\357’ in program——输入了中文的标点符号
error: stray ‘\357’ in program 20 int main(void){ 21 sigset_t s,p; 22 sigemptyset(&s); 23 sigaddset(&s,SIGINT);//;& ;这里的分号写成了中文的,所以出现了乱码 24 ...转载 2019-01-16 10:47:05 · 741 阅读 · 0 评论 -
keil里中断服务函数设置标志位时加volatile
在中断服务函数中,如果设置标志位,然后其他函数判断标志位,需要设置全局变量来实现。全局变量的声明中需要添加修饰符volatile,防止编译器对变量进行优化,导致程序出错。 下面是volatile的用法说明:volatile用于防止相关变量被优化。 例如对外部寄存器的读写。对有些外部设备的寄存器来说,读写操作可能都会引发一定硬件操作,但是如果不加volatile,编译器会把这些寄存...转载 2019-01-14 20:27:03 · 1409 阅读 · 0 评论 -
头文件中extern “C”的理解
C语言的. h头文件常会看到如下做法:#ifdef __FUNC_H_#define _FUNC_H_#ifdef __cplusplus__extern "C" {#endif#include<stm32f10x.h>int foo(char ,int );#ifdef __cplusplus__}#endif#endif开始看别人的代...原创 2019-01-13 19:33:06 · 1675 阅读 · 0 评论 -
C语言中的volatile关键字
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。下面举例说明。在DSP开发中,经常需要等待某个事件的触发,所以经常会写出这样的程序:short flag;void...转载 2019-01-02 21:02:16 · 401 阅读 · 0 评论 -
p2=&((int*)&b)定义错误解析
#include <stdio.h>int main() { int a,b; int*p1; int**p2; p1=&a; p2=&((int*)&b); printf("p1=%x\r\n",p1); printf("p2=%x\r\n",p2); return 0;}结果: er...原创 2018-12-30 15:34:28 · 693 阅读 · 1 评论 -
STM32 DMA正常模式等待传输完成和开始下一次传输
选择DMA的正常模式,即DMA只传输一次。如果当传输完一次后,还想再传输一次,就需要重启DMA:DMA_Cmd(DMA1_Channel6,DISABLE); 重新设置源地址 重新设置目的地址 重设传输数量 DMA_Cmd(DMA1_Channel6,ENABLE); 因此建议把DMA_InitStructure定义为全局变量,然后可以使用下面语句来重启DMA:DMA_Cmd ...转载 2018-12-27 20:22:28 · 8319 阅读 · 0 评论 -
STM32:DMA方式接收SPI总线数据,并按照协议进行处理
一、前言为满足高速数据传输的要求,采用SPI总线。MCU端(STM32F072 Cortex-M0)接收CPU发送的SPI数据(数据18个字节为一包,起始包为0xAA,最后一包为CheckSum校验),接收完成后,将校验正确的数据分配给RF发送给接收端。二、硬件电路如下图所示,SPI部分使用SPI2即PB12 PB13 PB14 PB15三、程序流程3.1 SPI初始化 SPI初始...转载 2018-12-26 20:44:08 · 4479 阅读 · 0 评论 -
STM32 USART 串口 DMA 接收和发送的源码详解!
STM32开发板PCB完整工程连接:http://www.cirmall.com/circuit/7 ... F%EF%BC%81#/details 硬件平台:STM32F103ZET6; 开发环境:KEIL 4;先说说应用通讯模式,串口终端的工作方式和迪文屏差不多,终端被动接受MCU发的指令,终端会偶尔主动发送一些数据给MCU(像迪文屏的触摸信息上传)。串口DMA发送:...转载 2018-12-26 20:42:46 · 2204 阅读 · 1 评论 -
C语言中使用union测试机器的大小端模式
#include <stdio.h>int main() { union checksys { int i; char ch; }c; c.i=1; if(c.ch==1) printf("小端模式"); else printf("大端模式"); return 0;} ...原创 2018-12-25 00:23:56 · 396 阅读 · 1 评论 -
char
#include <stdio.h>int main() { char i=1; char j='1'; //字符常量 char k[]="1"; //字符串常量 printf("%d\r\n",sizeof(i)); printf("%d\r\n",sizeof(j)); printf("%d\r\n",sizeof(k)); printf(...原创 2018-12-25 00:22:51 · 159 阅读 · 1 评论 -
C语言中sizeof的应用
#include <stdio.h>void fun(int b[100]){ printf("sizeof(b)=%d \n",sizeof(b)); }int main() { int *p=NULL; int a[100]; int b[100]; printf("sizeof(p)=%d \n",sizeof(p)); pri...原创 2018-12-24 00:14:46 · 300 阅读 · 1 评论 -
C语言中Static的作用
#include <stdio.h>static int j;void fun1(void){ static int i=0; i++; printf("i=%d \n",i);}void fun2(void){ int j=0; j++; printf("j=%d \n",j);}int main(){ int k=0;...原创 2018-12-23 23:18:30 · 1154 阅读 · 1 评论 -
C语言预定义宏(__LINE__、__DATE__等)浅析
ANSIC标准定义了以下5种可供C语言使用的预定义宏: __LINE__ 在源代码中插入当前源代码行号 __FILE__ 在源代码中插入当前源代码文件名 __DATE__ 在源代码中插入当前编译日期〔注意和当前系统日期区别开来〕 __TIME__ 在源代码中插入当前编译时间〔注意和当前系统时间区别开来〕 __STDC__ 当要求程序严格遵循ANSIC标准时该标识符被赋值为1。 标识符...转载 2018-12-21 16:36:10 · 594 阅读 · 0 评论 -
C语言中函数指针与指针函数
/**************函数指针************/#include <stdio.h>typedef int (*pFun)(int a,int b);int add(int a,int b);int sub(int a,int b);int mul(int a,int b);int div(int a,int b); int main(void){ ...原创 2018-12-19 00:33:55 · 781 阅读 · 0 评论 -
解析C语言数组中几个重要的概念:a,a+1,&a[0],&a[0]+1,&a,&a+1
#include <stdio.h>int main(void){ int a[4]={0}; printf("a = %x\r",a); //a=&a[0],代表数组首元素的首地址 printf("a+1 = %x\r",a+1);//a+1 printf("&a[0]= %x\r",&a[0]); print...原创 2018-12-18 23:25:32 · 4537 阅读 · 0 评论 -
定义指针给数组赋值
#include <stdio.h>int main(void){ int a[10]={0}; int *p=a; //a代表数组首元素的首地址,即p=&a[0]; int i; for(i=0;i<10;i++) { *(p+i)=i; printf("a[%d]=%d\r",i,*(p+i)); ...原创 2018-12-18 22:55:58 · 27074 阅读 · 3 评论 -
四舍五入结果
#include <stdio.h>int main(){float a=1.615565; float b;//b=(double)a; b= (double)( (int) (a*100 ) ) /100;printf("四舍五入结果:%f\n",b);return 0;}原创 2018-12-12 20:49:58 · 177 阅读 · 0 评论 -
C语言数组下标为负数
#include <stdio.h>unsigned int RxFrameBuff[512] = {1}; unsigned short RxDataFrameFlag = 0; int main(void){ unsigned int i; unsigned short RxCheckSum = 0; for(i=0;i<512;i++) { R...原创 2018-12-11 15:12:15 · 1102 阅读 · 0 评论