C语言基础进阶
意念586
电力系统继电保护装置-嵌入式软件开发
展开
-
#define rt_list_entry(node, type, member) \ ((ob_int*)((char *)(node) - (unsigned long)(&((type *)0)
#define list_entry(ptr, type, member)((type*)((char*)(ptr)-(unsigned long)(&((type*)0)->member)))的作用、功能。该方法就是 通过 type类型结构体 的 成员变量 member 的地址 去获取 该结构体的地址。。而 (unsigned long)(&((type*)0...原创 2019-09-05 13:56:07 · 876 阅读 · 0 评论 -
静态函数的优点 static
静态函数在函数的返回类型前加上关键字static,函数就被定义成为静态函数。 函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。定义静态函数的好处: 其他文件中可以定义相同名字的函数,不会发生冲突 静态函数不能被其他文件所用。 存储说明符auto,register,extern,static,对应两种存储期:自动存储期和静态原创 2016-01-04 13:39:15 · 5724 阅读 · 0 评论 -
联合体union的使用
1.联合体union的基本特性——和struct的同与不同union,中文名“联合体、共用体”,在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量。不过区别也挺明显:结构体(struct)中所有变量是“共存”的——优点是“有容乃大”,全面;缺点是struct内存空间的分配是粗放的,不管用不用,全原创 2015-11-25 09:42:08 · 536 阅读 · 0 评论 -
volatile关键字作用
volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改。用volatile关键字声明的变量i每一次被访问时,执行部件都会从i相应的内存单元中取出i的值。没有用volatile关键字声明的变量i在被访问的时候可能直接从cpu的寄存器中取值(因为之前i被访问过,也就是说之前就从内存中取出i的值保存到某个寄存器中),之所以直接从寄存器中取值,而不去内存中取值原创 2015-11-24 16:55:10 · 1744 阅读 · 0 评论 -
C语言在程序中内存
一、C语言程序的存储区域C语言编写的程序经过编绎-链接后,将形成一个统一的文件,它由几个部分组成,在程序运行时又会产生几个其他部分,各个部分代表了不同的存储区域:代码段(Code or Text):代码段由程序中的机器码组成。在C语言中,程序语句进行编译后,形成机器代码。在执行程序的过程中,CPU的程序计数器指向代码段的每一条代码,并由处理器依次运行。只读数据段(RO da原创 2015-10-15 16:03:43 · 1482 阅读 · 0 评论 -
MSP430FR5969内存分配的问题
cmd文件里的具体内容我就不贴了,大家自己可以看一下。cmd文件主要由两部分构成,一个是MEMORY{};另一个是SECTIONS{}其中MEMORY{}是定义内部所有寄存器及存储器的地址,在这里大部分内容都是厂家定义好的,一般不能修改。但是咱们今天要改的就是他,当然只能改其中允许该的地方,那就是FRAM的分配问题。根据数据手册里提供的内存分配情况(如下图)我们可以得知,59x9的内存从0x0原创 2015-10-10 11:25:54 · 2202 阅读 · 0 评论 -
C语言中的const、extern及结构体、联合体的定义
ConstConst关键词并不能把一个变量变成一个常量, 在符号前加上const表示这个符号不能被赋值, 即他的值对这个符号来说是只读的, 但并不代表这个值不能用其他方法去改变. 通过下面的例子就能比较好理解,int i = 5;const int *a = &i;*a = 8; //报错, 只读不能赋值i = 10; //OKConst最有用处的地方是用它来限定函原创 2015-08-21 09:38:40 · 6771 阅读 · 0 评论 -
extern "C"解释
extern "C"的用法解析C++中extern “C”含义深层探索 1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向原创 2015-08-21 09:16:28 · 550 阅读 · 0 评论 -
#pragma pack 解析
这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式。#pragma pack (n) 作用:C编译器将按照n个字节对齐。#pragma pack () 作用:取消自定义字节对齐方式。#pragma pack (push,1) 作用:是指把原来对齐方式设置压栈,并设原创 2016-01-06 10:00:29 · 577 阅读 · 0 评论 -
堆栈分析
一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两原创 2016-04-07 08:41:13 · 894 阅读 · 0 评论 -
文件操作模式分析
1.文件使用方式 “rt” 只读打开一个文本文件,只允许读数据 “wt” 只写打开或建立一个文本文件,只允许写数据 “at” 追加打开一个文本文件,并在文件末尾写数据 “rb” 只读打开一个二进制文件,只允许读数据 “wb” 只写打开或建立一个二进制文件,只允许写数据 “ab” 追加打开一个二进制文件,并在文件末尾写数据 “rt+” 读写打开一个文本文件,允许读和写 “wt+”转载 2016-09-22 09:37:04 · 448 阅读 · 0 评论 -
C语言 FILE结构体解释
struct _iobuf {char *_ptr; //文件输入的下一个位置int _cnt; //当前缓冲区的相对位置char *_base; //指基础位置(即是文件的其始位置)int _flag; //文件标志int _file; //文件的有效性验证int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取int _buf转载 2016-09-25 21:17:48 · 1411 阅读 · 0 评论 -
C语言 unlink函数
功能:删除一个名字(某些情况下删除这个名字所指向的文件)头文件:#include函数原型: int unlink(const char* pathname); 功能详解:unlink从文件系统中中删除一个名字,若这个名字是指向这个文件的最后一个链接,并且没有进程处于打开这个文件的状态,则删除这个文件,释放这个文件占用的空间。 如果这个名字转载 2016-09-14 09:21:33 · 21755 阅读 · 0 评论 -
va_start和va_end的使用
本文主要介绍va_start和va_end的使用及原理。 介绍这两个宏之前先看一下C中传递函数的参数时的用法和原理: 1.在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表void foo(...);void foo(parm_list,...);这种方式和我们以前认识的不大一样,但我们要记住这是C中一种传参的形转载 2016-07-25 17:00:04 · 382 阅读 · 0 评论 -
基于C语言sprintf函数的深入理解
printf 可能是许多程序员在开始学习C语言时接触到的 第二个函数(我猜第一个是main),说起来,自然是老朋友了,可是,你对这个老朋友了解多吗?你对它的那个孪生兄弟sprintf了解多吗?在将各种类 型的数据构造成字符串时,sprintf的强大功能很少会让你失望。由于sprintf跟printf在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。这也导转载 2016-07-13 22:45:08 · 6080 阅读 · 0 评论 -
strncpy解析
首先说下strcpystrcpy()是依据源串的\0作为结束判断的,不检查copy先的Buffer的Size,如果目标空间不够,就有BufferOverflow问题。strncpy的原型为:char * strncpy(char *dest, char *src, size_t n);其将字符串src中最多n个字符复制到字符数组dest中(它并不像strcpy一样遇到N原创 2016-07-13 22:39:16 · 507 阅读 · 0 评论 -
atoi() 函数解析
头文件:#include atoi() 函数用来将字符串转换成整数(int),其原型为:int atoi (const char * str);【函数说明】atoi() 函数会扫描参数 str 字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过 isspace() 函数来检测),直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并原创 2016-07-13 22:31:59 · 430 阅读 · 0 评论 -
register 类型修饰符
register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率。注意是尽可能,不是绝对。你想想,一个CPU 的寄存器也就那么几个或几十个,你要是定义了很多很多register 变量,它累死也可能不能全部把这些变量放入寄存器吧,轮也可能轮不到你。一、皇帝身边的小太监----寄存器 不知道什么是寄存器?那见过太监没有?没有?其实转载 2016-05-11 13:17:34 · 2828 阅读 · 0 评论 -
RT_Thead 中断
一、什么是中断?中断有两种,一种是CPU本身在执行程序的过程中产生的,一种是由CPU外部产生的。 cpu外部中断,就是通常所讲的“中断”(interrupt)。对于执行程序来说,这种“中断”的发生完全是异步的,因为不知道什么时候会发生。CPU对其的响应也完全是被动的, 可以通过“关中断”指令关闭对其的响应。 然而由软件产生的中断一般是由专设的指令,如X86中的“INT n”在程序中有意产生原创 2015-08-26 10:42:16 · 2042 阅读 · 0 评论 -
C++中调用C语言库文件
我们都知道C++语言兼容C语言,那么C++调用C语言库,为什么为什么需要 extern "C"的帮助?答案就是C++语言为了支持重构(重构的特征:相同的范围、相同的名字、不同的参数),在编译时对函数的命名方式进行了改变,编译后的名字包括一些参数的信息,这样才能在调用函数的时候对号入座。 那么extern "C"的作用,就是“提示”(为什么说提示,而不是“命令”呢,下面会分析)编译器,转载 2015-05-21 09:52:33 · 2856 阅读 · 0 评论 -
头文件——#include <filename.h>与#include "filename.h"区别
#include ,编译系统会到环境指定的目录去引用。#include "filename.h",系统一般首先在当前目录查找,然后再去环境指定目录查找。原创 2015-01-15 09:09:04 · 1189 阅读 · 0 评论 -
C语言数据类型转换
变量的数据类型是可以转换的。转换的方法有两种,一种是自动转换,一种是强制转换。自动转换自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成。自动转换遵循以下规则:若参与运算量的类型不同,则先转换成同一类型,然后进行运算。转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。所有的浮点运算都是以双精度进行的,即使原创 2015-01-13 18:29:51 · 492 阅读 · 0 评论 -
C语言指针变量作为函数参数
有读者反馈,不理解字符数组和普通数组的区别,下面笔者作一下解答。实际上,字符数组和普通数组一样,没有本质区别。请大家注意数组类型的含义:数据类型指的是数组所包含的元素的类型,而不是数组名的类型,数组名永远是一个指针,指向第一个元素的地址,即数组首地址。字符数组的每个元素都是char类型,整型数组的每个元素都是int类型。scanf() 和 printf() 函数有一种格式化原创 2015-01-13 18:29:56 · 614 阅读 · 0 评论 -
C语言文件包含命令
文件包含是C预处理程序的另一个重要功能。文件包含命令行的一般形式为: #include"文件名"在前面我们已多次用此命令包含过库函数的头文件。例如:#include "stdio.h"#include "math.h"文件包含命令的功能是把指定的文件插入该命令行位置取代该命令行,从而把指定的文件和当前的源程序文件连成一个源文件在程原创 2015-01-13 18:30:07 · 778 阅读 · 0 评论 -
C语言动态存储分配
在数组一章中,曾介绍过数组的长度是预先定义好的,在整个程序中固定不变。C语言中不允许动态数组类型。例如:int n;scanf("%d",&n);int a[n];用变量表示长度,想对数组的大小作动态说明,这是错误的。但是在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。对于这种问题,用数组的办法很难解决。为了解决上述问题,C语言提供了一些内存原创 2015-01-13 18:30:22 · 547 阅读 · 0 评论 -
C语言局部变量和全局变量
在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放。这一点表明形参变量只有在函数内才是有效的,离开该函数就不能再使用了。这种变量有效性的范围称变量的作用域。不仅对于形参变量,C语言中所有的量都有自己的作用域。变量说明的方式不同,其作用域也不同。C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。局部变量局部变量也称为内部变量。局部变量原创 2015-01-13 18:30:57 · 507 阅读 · 0 评论 -
C语言变量的存储类别
动态存储方式与静态动态存储方式前面已经介绍了,从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量。从另一个角度,从变量值存在的作时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式。静态存储方式:是指在程序运行期间分配固定的存储空间的方式。动态存储方式:是在程序运行期间根据需要进行动态的分配存储空间的方式。用户存储空间可以分为三个部分:程序区;原创 2015-01-13 18:31:01 · 477 阅读 · 0 评论 -
C语言文件包含命令
文件包含是C预处理程序的另一个重要功能。文件包含命令行的一般形式为: #include"文件名"在前面我们已多次用此命令包含过库函数的头文件。例如:#include "stdio.h"#include "math.h"文件包含命令的功能是把指定的文件插入该命令行位置取代该命令行,从而把指定的文件和当前的源程序文件连成一个源文件在程原创 2015-01-13 18:31:06 · 1239 阅读 · 0 评论 -
C语言整型数据(整数)
整型数据即整数。整型数据的分类整型数据的一般分类如下:基本型:类型说明符为int,在内存中占2个字节。短整型:类型说明符为short int或short。所占字节和取值范围均与基本型相同。长整型:类型说明符为long int或long,在内存中占4个字节。无符号型:类型说明符为unsigned。无符号型又可与上述三种类型匹配而构成:无符号基本型:类型说明符为unsig原创 2015-01-13 18:30:41 · 3821 阅读 · 0 评论 -
C语言条件编译详解
预处理程序提供了条件编译的功能。可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。这对于程序的移植和调试是很有用的。条件编译有三种形式,下面分别介绍。第一种形式第一种形式的格式为: #ifdef 标识符 程序段1 #else 程序段2 #endif它的功能是,如果标识符已被 #define命令定翻译 2015-01-13 15:16:07 · 2133 阅读 · 0 评论 -
C语言常量与变量
对于基本数据类型量,按其值是否可变又分为常量和变量两种。在程序执行过程中,其值不发生改变的量称为常量,其值可变的量称为变量。它们可与数据类型结合起来分类,例如,可分为整型常量、整型变量、浮点常量、浮点变量、字符常量、字符变量。常量在程序执行过程中,其值不发生改变的量称为常量。常量分类:常量说明直接常量(字面量)可以立即拿来用,无需任何说明的量,例如:原创 2015-01-13 18:30:43 · 589 阅读 · 0 评论 -
在C语言中,double、long、unsigned、int、char类型数据所占字节数
和机器字长及编译器有关系:所以,int,long int,short int的宽度都可能随编译器而异。但有几条铁定的原则(ANSI/ISO制订的): 1 sizeof(short int)<=sizeof(int) 2 sizeof(int)<=sizeof(long int) 3 short int至少应为16位(2字节) 4 long int至少应为32位。 unsigned 是转载 2015-01-15 08:56:33 · 742 阅读 · 0 评论 -
新手入门陌生的布尔数据
布尔数据是sql server中的一个名词,布尔数据由binary(二进制)数字组成,既0和11为true(真),0为false(假)在计算机科学中,布尔数据类型又称为逻辑数据类型,是一种只有两种取值的原始类型:非零(通常是1或者-1)和零(分别等价于真和假)。在一些语言中,布尔数据类型被定义为可代表多于两个真值。例如,ISO SQL:1999标准定义了一个SQL布尔型可以储存三个可能原创 2015-01-15 09:33:41 · 666 阅读 · 0 评论 -
C语言实型数据(浮点数)
实型数据也称为浮点数或实数。在C语言中,实数只采用十进制。它有二种形式:十进制小数形式和指数形式。实数的表示1)十进制数形式由数码0~ 9和小数点组成。 例如:0.0、25.0、5.789、0.13、5.0、300.、-267.8230等均为合法的实数。注意,必须有小数点。2) 指数形式由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)原创 2015-01-13 18:30:46 · 1219 阅读 · 0 评论 -
C语言数据类型转换
变量的数据类型是可以转换的。转换的方法有两种,一种是自动转换,一种是强制转换。自动转换自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成。自动转换遵循以下规则:若参与运算量的类型不同,则先转换成同一类型,然后进行运算。转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。所有的浮点运算都是以双精度进行的,即使原创 2015-01-13 18:30:49 · 496 阅读 · 0 评论 -
C语言指针变量作为函数参数
有读者反馈,不理解字符数组和普通数组的区别,下面笔者作一下解答。实际上,字符数组和普通数组一样,没有本质区别。请大家注意数组类型的含义:数据类型指的是数组所包含的元素的类型,而不是数组名的类型,数组名永远是一个指针,指向第一个元素的地址,即数组首地址。字符数组的每个元素都是char类型,整型数组的每个元素都是int类型。scanf() 和 printf() 函数有一种格式化原创 2015-01-13 18:30:54 · 692 阅读 · 0 评论 -
C语言局部变量和全局变量
在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放。这一点表明形参变量只有在函数内才是有效的,离开该函数就不能再使用了。这种变量有效性的范围称变量的作用域。不仅对于形参变量,C语言中所有的量都有自己的作用域。变量说明的方式不同,其作用域也不同。C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。局部变量局部变量也称为内部变量。局部变量原创 2015-01-13 18:29:59 · 2629 阅读 · 0 评论 -
C语言实型数据(浮点数)
实型数据也称为浮点数或实数。在C语言中,实数只采用十进制。它有二种形式:十进制小数形式和指数形式。实数的表示1)十进制数形式由数码0~ 9和小数点组成。 例如:0.0、25.0、5.789、0.13、5.0、300.、-267.8230等均为合法的实数。注意,必须有小数点。2) 指数形式由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)原创 2015-01-13 18:29:48 · 2758 阅读 · 0 评论 -
C语言无参数宏定义
在C语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。在C语言中,“宏”分为有参数和无参数两种。本节讨论无参数宏。无参宏定义无参宏的宏名后不带参数。其定义的原创 2015-01-13 18:31:03 · 1681 阅读 · 0 评论 -
C语言文件include包含命令
文件包含是C预处理程序的另一个重要功能。文件包含命令行的一般形式为: #include "文件名"在前面我们已多次用此命令包含过库函数的头文件。例如:#include "stdio.h"#include "math.h"文件包含命令的功能是把指定的文件插入该命令行位置取代该命令行,从而把指定的文件和当前的源程序文件连成一个源文件在程序设计中,文转载 2015-01-13 15:05:38 · 5325 阅读 · 0 评论