重温c语言--进阶钻石段位篇
此专栏是笔者重温C语言时对以前笔记的一些整理和总结。学会了它们,不一定能成为大神,但不会它们,我们必定是小白。此专栏没有讲解C语言的基本语法等知识。更适合对C语言有了基本认识,想提高一个等级能力的人。
theboynoName
我不是码农,是有情怀的画家。
展开
-
C语言零散知识点总结----钻石段位篇
C语言零散知识点总结-钻石段位篇我们总需要走走停停,回头看看。下面是笔者重温C语言时对以前笔记的一些整理和总结。学会了它们,不一定能成为大神,但不会它们,我们必定是小白。下面的每个选项卡都是一个超链接。超链接里是此知识点的详细介绍。C语言钻石段位测试题链接https://blog.csdn.net/qq_23274715/article/details/106302128C语言的发展简介基础知识自动转换原则大小端字节对齐数值表示与后缀ASCII码与转义字符结构体使用小技巧获取原创 2020-05-23 22:31:49 · 1568 阅读 · 0 评论 -
C语言钻石段位测试题答案
C语言测试题答案测试题见此链接:C语言钻石段位测试题常数123ul,123.45l中的ul、l代表什么含义?(2分)答案:这属于数值后缀的知识点。具体请参看数值常量后缀相关介绍C语言中,数值16用十六进制表示为0x10,哪用二进制如何表示?(2分)答案:0b10000.具体请参看数值常量后缀相关介绍举例谈谈#define Mul(x,y) x*y这个带参宏的缺点?(2分)答案:如果使用Mul(3+5,6).得到的结果则为3 + 5*6 = 33.和我们的预期不一致。所原创 2020-05-23 16:30:54 · 828 阅读 · 0 评论 -
C语言钻石段位测试题
C语言钻石段位测试题满分100分的测试题,你能做多少分?答案见链接。常数123ul,123.45l中的ul、l代表什么含义?(2分)C语言中,数值16用十六进制表示为0x10,哪用二进制如何表示?(2分)举例谈谈#define Mul(x,y) x*y这个带参宏的缺点?(2分)谈谈#undef预处理命令的应用。(2分)谈谈#if,#ifdef,#ifndef的使用区别。(2分)如果编译时,不满足某些条件,用户如何向编译器抛出警告或者错误。(2分)谈谈函数指针的用途原创 2020-05-23 16:27:06 · 652 阅读 · 1 评论 -
通过结构体成员获取结构体地址
通过结构体成员获取结构体地址我们在编程中有时会遇到想通过某个结构体成员变量的地址来获取此结构体的首地址。对于这个问题,可以分两种情况(第一种是第二种的特例)成员变量是结构体的第一个成员:我们都知道,结构体的首地址等于其第一个成员的首地址,所以对这种情况可以直接进行强转。成员变量是结构体的任意一个成员:下面会重点谈论此方法。Linux实现此功能的源码如下#define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER) #de原创 2020-07-18 22:49:35 · 2787 阅读 · 0 评论 -
const关键字的用法
const关键字让程序更健壮我们都知道,指针是c的精华,指针让程序的设计变得如鱼得水。但是,指针本身就像一匹没有缰绳的野马,太容易玩火自焚。而const就像让野马带上了缰绳,这样就可以更好的控制它的所作所为。其次,善用const修饰,也会增强程序的可读性。这么神奇的const,当然要好好研究研究它的用法了。const修饰变量(变量将变成常量)在平常的使用过程中,很多人都喜欢用宏来定义一个频繁...原创 2019-10-02 10:31:49 · 270 阅读 · 0 评论 -
volatile关键字的使用你真的了解吗?
volatile关键字的使用你真的了解吗?volatile关键字是用来防止编译器对一个变量优化,因为有时对变量优化会造成我们不期望的结果。网上很多的说法是强制访问内存中的值,而不是缓存中的。注意,这里的缓存不是指cache,而是cpu寄存器(R0~R15)。除此之外,我们必须明确,volatile行为在编译阶段,而非程序运行阶段(面试高频题)。所以我们对volatile最直观的认识可以是看汇编代码。下面会讲。那什么时候会用volatile?一般有下面几种情况:操作寄存器。一般指外设寄存器等。中断。中原创 2020-05-20 15:01:37 · 264 阅读 · 0 评论 -
全局变量的存储类型
全局变量的存储类型 在函数外部定义的变量是全局变量,它的作用域是从变量的定义点开始,到本程序文件的末尾。全局变量分为两种:1.extern声明的变量 2.static声明的变量。 当未对全局变量指定存储类别时,隐含为extern类别。用extern和static声明的全局变量都是静态存储方式(存放在静态存储区),都是在编译时分配内存的。1.extern声明的全局变量原创 2017-07-16 17:41:54 · 12431 阅读 · 0 评论 -
内部函数和外部函数
很多人在问 static 和extern的区别 或者他们的用途,通过看这篇博客以及我写的全局变量的类型的那篇博客相信大家都会深深的理解他俩的用途和区别。1.内部函数 如果一个函数只能被本文件中的其他函数所调用,称它为内部函数。内部函数又称为静态函数。在定义内部函数时,在函数名和函数类型前加 static .如下: static 类型标识符 函数名 () {原创 2017-07-16 17:49:04 · 13470 阅读 · 0 评论 -
可重入函数和不可重入函数
可重入函数和不可重入函数作为一个编程人员,一定要有可重入和不可重入概念,但工作中发现的现象让我大跌眼镜——很多人没听说过!!!亡羊补牢,为时不晚,现在在脑子中种下这颗概念种子也不迟。为什么说一定要有可重入和不可重入的概念呢,因为我们的程序肯定不只在main()函数中简单的跑一个while(1)循环,一般都会涉及到中断和操作系统。这时,就必须要考虑一个函数是不是可重入的以及如果不可重入对程序设计会...原创 2019-10-02 10:18:09 · 412 阅读 · 0 评论 -
弱函数与回调函数在模块化编程中的使用
弱函数与回调函数弱函数和回调函数是我们模块化编程中两个很重要的概念,下面一一解析。弱函数的介绍与使用__weak关键字用来修饰函数或者变量。表示修饰的函数或变量的使用优先级较低。即如果我们定义了一个函数或变量,它与关键字__weak修饰的函数或者变量名一致。则优先使用我们定义的,而忽略__weak修饰的。但如果我们没有定义这样的函数或者变量名,则使用__weak所修饰的。我们叫这种函数为弱函数。/* test1.c */#include <stdio.h>void HelloFun原创 2020-05-22 11:02:50 · 2345 阅读 · 0 评论 -
C语言的变参函数
C语言的变参函数先提一个问题,什么是变参函数?简单的讲就是一个函数形参的个数不固定。比如我们天天用的printf()函数就是一个变参函数。像printf("%d",i)是两个参数,而printf("%d %d",i,j)是三个参数。那么如何用以及如何写变参函数了,那我们就要从stdrag.h谈起了。stdrag.h头文件c99标准的7.15章节讲到了stdrag.h这个头文件,详细内容可以参...原创 2019-10-02 11:04:51 · 672 阅读 · 0 评论 -
c语言中的数据类型的自动转换原则
c语言中的数据类型的自动转换原则先贴下面的一段程序,问打印结果是什么?如果回答错误,就好好研究研究后面的讲解吧。#include <stdio.h>#include <stdint.h>void main(void){ int32_t a = -10; uint32_t b = 5; if(a > b){ pr...原创 2020-04-28 16:07:44 · 539 阅读 · 0 评论 -
数值常量后缀相关介绍
数值常量后缀相关介绍在说数值后缀之前,我们先对c语言中的常数做一个简单的分类描述:c语言中的常数可以分为整型常数和浮点常数。整型常数有下面几种表示方法:十进制表示法:如16.八进制表示法:以0开头.如020.也代表16.十六进制表示法:以0x开头.如0x10.也代表16.二进制表示法:以0b开头.如0b10000.也代表16.浮点常数有下面几种表示方法:科学计数法:如1.234e2.小数点形式:如123.4.数值后缀简单介绍数值后缀有如下特点:只有数值常数原创 2020-05-20 15:40:37 · 1495 阅读 · 0 评论 -
C语言字节对齐介绍
C语言字节对齐介绍我们常提到的1字节、4字节对齐等具体是什么意思?回答:对齐指存放当前数据的地址能否被n整除(n就是对齐值,如1,4等)。比如:地址0x0004中存放int型数据。那么它满足4字节和1字节的对齐。但地址0x0003中存放int型数据,它只满足1字节对齐,不满足4字节对齐。我们先谈谈为什么会有字节对齐这个概念?回答:我们应该都听过8位、16位、32位、64位等位数的处理器。如我们最常见的STM32就是32位单片机。我们所说的n位其实指的就是地址总线的宽度,与其相关的还有数据总原创 2020-05-20 11:48:07 · 1009 阅读 · 0 评论 -
处理器的大小端模式
处理器的大小端模式处理器的大小端是由处理器的硬件结构决定的。跟软件没有关系。我们都知道uint32_t类型的数据占四个字节的大小。那么这四个字节在内存中如何存储?(例如高位字节在高地址,还是在低地址?)这就是大小端的问题。比如定义uint32_t data = 0x87654321.存放在0x1000开始的一段内存中。那么:在小端模式下:存放顺序为[1003] = 0x87,[1002] = 0x65,[1001] = 0x43,[1000] = 0x21.在大端模式下:存放顺序为[1000] =原创 2020-05-23 16:17:32 · 588 阅读 · 0 评论 -
C语言的运算符优先级
c语言运算符优先级运算符优先级由高到低[] () . -> 左到右结合-(负号) (类型)强制类型转换 ++ -- *(取值用算符) &(取地址运算符) ! ~ sizeof 等单目运算符从右到左结合/ * % 左到右+ - 左到右<< >> 左到右> >= < <= 左到右== != 左到右&^|...原创 2020-04-28 21:19:16 · 434 阅读 · 0 评论 -
c语言中常用宏使用
常用宏使用宏替换是预处理命令的一部分,它在预编译阶段被替换。可以用gcc -E test.c > xxx.c命令来获取宏替换后的文件到xxx.c中。打开后会发现此文件很大,而且也看不懂。别着急,翻到文件末尾,你就会发现宏替换后的源程序了。宏定义可以分为三类。用户自定义的宏如#define MAXBUFF_LEN 1024。c标准定义的宏如__LINE__。第三种是编译器定义的宏如_...原创 2019-10-04 20:08:12 · 486 阅读 · 0 评论 -
常用输出宏
ANSI C标准中有几个标准预定义宏(也是常用的): LINE:在源代码中插入当前源代码行号; FILE:在源文件中插入当前源文件名; DATE:在源文件中插入当前的编译日期 TIME:在源文件中插入当前编译时间; STDC:当要求程序严格遵循ANSI C标准时该标识被赋值为1; __cplusplus:当编写C++程序时该标识符被定义。转载 2017-12-27 20:52:19 · 370 阅读 · 0 评论 -
c语言中的变参宏
c语言中的变参宏此节主要描述变参宏的用途、如何使用、以及如何调用。1. 为什么要用变参宏在讲C语言的变参函数的一节介绍了如何编写、使用变参函数。但有时候需要对变参函数进行宏重包装,比如我们调试程序的过程中就喜欢把printf()函数包装成自己的调试函数已达到可以控制输出等级。如下:#define debug(MY_DEBUG_ENABLE,...) do{ \ if(MY_DEB...原创 2019-10-03 22:02:02 · 623 阅读 · 1 评论 -
C语言编程----预处理指令使用
预处理指令介绍我们使用#作为一个预处理命令的开始。编译器在预处理阶段会根据预处理命令对源文件进行转化。所以,有关预处理相关的替换调试,可以通过编译预处理后生成的文件进行对比。我们常用的预处理命令有如下:#include:用于包含我们要使用的头文件。#define :宏定义。分为下面两种情况含参宏定义:如#define MAXIS(x,y) (x > y) ? x : y。不含参宏定义:如#define LEN_MAX 1#if :条件编译,后面跟表达式。如#if 1.#原创 2020-05-21 21:14:06 · 399 阅读 · 0 评论 -
C语言中字符串拼接之#,##的妙用
字符串拼接相关的宏字符串拼接的接可以分为下面两种情况:在程序运行过程中,使用字符串连接函数strcat()等字符串处理函数进行字符串的拼接。这属于字符串的动态拼接。在预处理阶段进行字符串的拼接。这属于字符串的静态拼接。下面我们重点介绍静态拼接。预处理阶段的字符串拼接讲拼接前必须明确下面几个概念:字符串:我们下面提到的字符串是使用""包起来的。如"guoweilkd".标识符:...原创 2020-05-06 21:41:44 · 4556 阅读 · 3 评论 -
指针剖析(上)
c语言0级指针到n级指针的详解0级指针其实就是变量,如int i。因为文章下面要从变量的角度来剖析1级指针到n级指针,便给他们起了这样的一个名称,希望大家不要误解。网上有一大堆的有关指针的介绍,但很多都剖析的不深,看完之后还是半知半解,因此便写下了这篇文章。希望没有让读者失望。本文的剖析思路是从变量映射到一级指针,再从一级指针映射到二级指针再到n级指针。指针变量与普通变量相似之处指针变量与普...原创 2019-10-09 21:53:50 · 247 阅读 · 2 评论 -
指针剖析(下)
指针常见的使用方式和误区指针剖析(上)主要在概念和行为上介绍了指针的特点。这篇将对指针的常用使用方式做一下介绍。比如指针的运算以及它和普通变量运算的区别、常见的指针类型(int *p、int *p[n]、int (*p)[n]、int (* p)()、int * fun(void)、int **p之间的区别和含义)以及二级指针用在何处。指针的运算对于指针的运算,玩c的都很熟悉。比如p++、p...原创 2019-10-10 21:13:18 · 170 阅读 · 1 评论 -
给二维数组分配空间
对于一维数组内存的分配,大家都很熟悉。比如分配一个256字节大小的内存堆:uint8_t *pBuff = NULL;pBuff = (uint8_t *)malloc(256);if(pBuff != NULL){ //分配成功}下面为给二维数组分配等同于uint8_t data[4][8]的内存堆:uint8_t **pBuff = NULL;`pBuff = (uint8_...原创 2018-10-21 14:13:48 · 1008 阅读 · 0 评论 -
c的历史
C历史C语言最早的原型是ALGOL 60语言,1963年,剑桥大学将其发展成为CPL(Combined Programing Language)。1967年,剑桥大学的Matin Richards对CPL语言进行了简化,产生了BCPL语言。1970年,美国贝尔实验室(Bell Labs)的Ken Thompson将BCPL进行了修改,并取名叫做B语言,意思是提取CPL的精华(Boiling CPL down to its basic good features)。并用B语言写了第一个UNIX系统。1973原创 2020-05-22 22:31:24 · 578 阅读 · 0 评论 -
printf函数使用大全
printf函数格式详解我们在做字符串转化,字符串拼接时,通常喜欢用sprintf()函数。它的使用类似printf()函数。它的函数原型为int printf(const char *format, ...).其中format用来指定转化格式。是高效使用这类函数的基础。这篇文章的内容就是要介绍format字符串的格式。如下:format = %[flag][width][.precison][length]specifierflag字段有如下选择:-:字符串左对齐。默认是右对齐。+:正负号原创 2020-05-22 22:00:30 · 1153 阅读 · 0 评论 -
结构体使用小技巧
结构体使用小技巧我们编写程序(稍微大点的工程)时,使用结构体是必不可少的。下面时常见的一些使用方法。获取指定成员到结构体起始位置的偏移量size_t offsetof(type, member)描述:获取指定成员到结构体起始位置的偏移量.使用此宏需要包含stddef.htype:结构体member:结构体成员。return:偏移量。使用例程如下:#include <stdio.h>#include <stdint.h>#include <stdd原创 2020-05-21 15:09:50 · 315 阅读 · 0 评论 -
c编程----段定义的使用
段定义的使用参考资源Keil_v5/ARM/Hlp/DUI0375G_02_mdk_armcc_user_guide.pdf.中的第九章。__attribute__ 关键字用于指定变量、结构类型、函数等的特殊属性。关键字的格式如下:__attribute__((attribute1,attribute2,...))__attribute__((__attribute1__,__att...原创 2019-12-08 16:40:51 · 422 阅读 · 0 评论 -
c库之字符处理相关函数
字符处理相关函数需要包含头文件<ctype.h>int islower (int c):判断是否为小写字母(a~z)c:输入要判断的字符。return: 0:false >0:ture(是小写字母)。下面所有的函数格式同此函数。isupper();//大写字母(A~Z)isalpha();//字母,包括大小写(A~z)isdigit();//数字(0~9)...原创 2020-03-30 17:19:46 · 192 阅读 · 0 评论 -
ASCII码表和转义字符表
ASII码表和转义字符表ASII码表ASCII(美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统。由基础的ASCII码表(0-127)和扩展的ASCII码表(128-255)构成。转义字符C语言中定义了一些字母前加\来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符。关于技术交流此...原创 2019-10-16 21:15:43 · 1745 阅读 · 0 评论 -
串口终端显示倒计数的实现
如何在串口终端显示倒计数效果图如下:用转义字符\b(退格)做。程序如下#include <stdio.h>#include <stdint.h>#include <unistd.h>void main(void){ int count = 9; printf("wait:%d",count); fflush(stdout)...原创 2020-04-28 17:19:06 · 462 阅读 · 0 评论 -
ANSI转义码----让你的终端打印有颜色
ANSI转义码(ANSI escape code)参考链接:http://www.thefullwiki.org/ANSI_escape_codehttps://en.wikipedia.org/wiki/ANSI_escape_codeANSI转义序列是一种带内信号的转义序列标准,用于控制视频文本终端上的光标位置、颜色和其他选项。在文本中嵌入确定的字节序列。转义序列的控制字符转义序列使用ESC开头。其中ESC的ASCII值为27(十六进制为0x1B,把进制为033).在使用时一般表示为\0原创 2020-05-23 22:18:03 · 1310 阅读 · 0 评论