
C/C++
文章平均质量分 54
yk__peng
用心生活。。。
展开
-
不能对数组名进行直接复制与比较。
不能对数组名进行直接复制与比较。示例中,若想把数组a的内容复制给数组b,不能用语句 b = a ,否则将产生编译错误。应该用标准库函数strcpy进行复制。同理,比较b和a的内容是否相同,不能用if(b==a) 来判断,应该用标准库函数strcmp进行比较。语句p = a 并不能把a的内容复制指针p,而是把a的地址赋给了p。要想复制a的内容,可以先用库函数malloc为p申请一块容量为strl转载 2013-04-22 15:42:06 · 968 阅读 · 0 评论 -
Heap与stack
Heap与stackStack的空间由操作系统自动分配/释放,Heap上的空间手动分配/释放。Stack空间有限,Heap是很大的自由存储区内存分配域malloc函数分配的内存空间即在堆上程序在编译期对变量和函数分配内存都在栈上进行程序运行过程中函数调用时参数的传递也在栈上进行转载 2013-04-15 19:51:08 · 502 阅读 · 0 评论 -
array_name和&array_name的异同
例 char a[MAX]; /*array of MAX characters*/ char *p = a; /*p为指向数组的指针*/ char *pa = &a; /*该语句是不正确的,pa的类型为'char *',而&a的类型为'char (*)[MAX]’*/ char (*pb)[MAX] = &a; /*该语句是正确原创 2013-04-15 19:08:42 · 640 阅读 · 0 评论 -
强制数据类型转换的总结
转载 2013-04-15 19:52:16 · 659 阅读 · 0 评论 -
代码行内的空格
关键字之后要留空格函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别‘(’向后紧跟, ‘)’ ‘,’ ‘;’向前紧跟,紧跟处不留空格‘,’之后要留空格二元操作符的前后应当加空格。一元操作符前后不加空格。象“[]”、“.”、“->”这类操作符前后不加空格。转载 2013-04-15 20:14:51 · 773 阅读 · 0 评论 -
free()
例子:free(p)如果p是NULL指针,那么free对p无论操作多少次都不会出问题如果p不是NULL指针,那么free对p连续操作两次就会导致程序运行错误。转载 2013-04-15 20:44:43 · 652 阅读 · 0 评论 -
内存分配方式有三种
内存分配方式有三种:1.从静态存储区域分配2.在栈上创建3.从堆上分配,亦称动态内存分配 :malloc或new :free或delete转载 2013-04-15 20:48:45 · 990 阅读 · 0 评论 -
C/C++的数值常数后缀的使用总结
1.数值常数有:整型常数、浮点常数; 2.只有数值常数才有后缀说明; 3.数值常数后缀不区分字母大小写。 (1)整型常数的表示形式有:十进制形式、以0开头的八进制形式、以0x开头的十六进制形式,无二进制形式。 整型常数默认是signed int的。 对整型常数进行类型转换的后缀只有:u或U(unsigned)、l或L(long)、u/U与l/L转载 2013-04-23 22:04:16 · 1651 阅读 · 0 评论 -
注释规则
1.注释是对代码的“提示”,而不是文档2.如果代码本来就是清楚的,则不必加注释。3.边写代码边注释4.注释应当准确、易懂,防止注释有二义性5.尽量避免在注释中使用缩写,特别是不常用缩写。6.注释的位置应与被描述的代码相邻7.当代码比较长,应当在一些段落的结束处加注释注释实例:/** 函数介绍:* 输入参数:* 输出参数:* 返回值:*/转载 2013-04-15 20:20:04 · 642 阅读 · 0 评论 -
const
//const (有点像只读变量)用const定义常量:1.const类型定义:指明变量或对象的值是不能被更新,引入目的是为了取代预编译指令。2.可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。3.编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。4.可以节省空间,避免不转载 2013-04-15 20:37:18 · 555 阅读 · 0 评论 -
函数调用约定
先看几个例子:#include struct a{char name[10];int age;}aa[3]={{"abc",20},{"def",21},{"ghi",22}};int main(int argc, char *argv[]){ struct a *paa=aa; printf("%c%c%c",(*(paa+1)).name[0],(*paa++).name[1原创 2013-04-15 21:19:55 · 512 阅读 · 0 评论 -
assert()命令
assert()命令:用于Debug调试版本。用法:assert(表达式)如果表达式为true,则继续执行下一条语句;如果表达式为false,则报错并退出程序;打印失败条件的内容;打印发生错误的行号;打印错误所在的源文件名;使程序以出错状态结束;NDEBUG宏定义#define NDEBUG#include 在包含头文件assert.h之前,定义NDEB转载 2013-04-15 19:35:27 · 1360 阅读 · 0 评论 -
程序挂起的四大原因
程序挂起的四大原因:1.程序中有死循环;2.程序运行的时间比所期望的长;3.程序在等待某些输入信息,并且直到输入正确后才会继续运行;4.程序设计的目的就是为了延迟一段时间,或者暂停执行。原创 2013-04-15 19:30:04 · 4969 阅读 · 0 评论 -
标识符命名规则
匈牙利命名规则主要思想:在变量和函数名中加入前缀以增进人们对程序的理解具体规则:标识符应当直观且可以拼读,可望文知意,不必进行“解码”。标识符的长度应当符合“min-length && max-information”原则命名规则尽量与所采用的操作系统或开发工具的风格保持一致程序中不要出现仅靠大小写区分的相似的标识符程序中不要出现标识符完全相同的局部变量和全局变量转载 2013-04-15 20:08:39 · 1234 阅读 · 0 评论 -
循环语句的效率
1.在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。for (row=0; row<100; row++){ for ( col=0; col<5; col++ ) { sum = sum+ a[row][col]; }}2.如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。if转载 2013-04-16 12:22:06 · 666 阅读 · 0 评论 -
硬件驱动模块
硬件驱动模块通常应包括如下函数:1.中断服务程序ISR2.硬件初始化 1.修改寄存器,设置硬件参数 2.将中断服务程序入口地址写入中断向量表:3.设置CPU 针对该硬件的控制线4.设置CPU 内部对应寄存器使其作为控制信号;5.设置CPU 内部的针对该设备的中断屏蔽位,设置中断方式6.提供一系列针对该设备的操作接口函数转载 2013-04-16 21:43:11 · 730 阅读 · 0 评论 -
标准库函数优势
1.准确性2.高效性3.可移植性转载 2013-04-16 22:30:47 · 1077 阅读 · 0 评论 -
内存管理的规则
1.用malloc之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。2.不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。3.避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作。4.动态内存的申请与释放必须配对,防止内存泄漏。5.用free释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。 (free函数只是把原创 2013-04-15 20:52:33 · 509 阅读 · 0 评论 -
不要用return语句返回指向“栈内存”的指针
char *GetString(void){ char *p = "hello world"; // (char p[]= "hello world";) return p; // 编译器将提出警告}void Test4(void){ char *str= NULL; str= GetString(); printf("%s\n”,s原创 2013-04-16 11:33:29 · 1031 阅读 · 0 评论 -
C语言在嵌入式系统的不足
C语言在嵌入式系统的不足1.ISO C 的语法特性会导致代码体积膨胀和执行效率的低下2.C 有可能会对嵌入式软件带来额外的开销1.C语言的改造1998年,Embedded C 规范正式出炉(EC)2.EC 是标准C 语言的一个子集3.剔除了一些实现复杂和会导致额外负担语法元素。例如:多重继承和虚基类、RTTI、异常处理、模版、命名空间等等4.在标准库方面,E转载 2013-04-16 12:33:42 · 726 阅读 · 0 评论 -
单任务程序典型架构
1.从CPU 复位时的指定地址开始执行;2.跳转至汇编代码startup 处执行;3.跳转至用户主程序main 执行,在main 中完成: 1.初试化各硬件设备; 2.初始化各软件模块; 2.进入死循环(无限循环),调用各模块的处理函数死循坏例子:操作系统是死循环;WIN32 程序是死转载 2013-04-16 12:38:11 · 733 阅读 · 0 评论 -
C语言标准库的历史
在C89标准中: 在95年的修正版中: 在C99中增加了六个函数库:转载 2013-04-16 22:29:29 · 738 阅读 · 0 评论 -
指针,引用 的区别
#includevoid pt(int * pta,int * ptb){int *ptc;ptc=pta;pta=ptb;ptb=ptc;}void ref(int &ra,int &rb){int rc;rc=ra;ra=rb;rb=rc;}void main(){int a=3;int b=4;int *pa=&a;int *pb=&b;pt(pa,pb);p原创 2013-04-16 10:57:53 · 628 阅读 · 0 评论 -
中断服务程序的要求
1.不能返回值;2.不能向ISR 传递参数;3.ISR 应该尽可能的短小精悍函数4.不能带来重入和性能问题转载 2013-04-16 21:37:26 · 709 阅读 · 0 评论 -
函数调用时发生了什么
跟踪调用链:1.C语言自动提供的服务2.哪些函数调用了哪些函数3.实现机制:堆栈中的过程活动记录过程活动记录:1.是一种数据结构2.支持过程调用3.记录调用结束以后返回调用点所需要的全部信息转载 2013-04-17 22:02:22 · 560 阅读 · 0 评论 -
库函数注意事项
1.库名原则上是保留字。编程人员不能定义与标准库名称同名的外部对象。2.库头文件或文件名可以内置在实现中,但仍然要被包括之后才能访问其名称3.编程人员可以多次按任意顺序包括库头文件转载 2013-04-17 22:09:57 · 781 阅读 · 0 评论 -
C语言标准库函数目录
不是软件产业的领头人,就永远只有跟随的份,不过也有好处,站在前人的肩膀上可以节省很多时间去做更有用的事。现在说说C语言的标准库函数。好多C语言库函数参考还是用的TC的库函数参考,因此特地把现在C语言(C99)标准库函数的24个头文件列表如下:assert.h inttypes.h(C99) signal.h stdlib.hcomplex.h(C99) iso646.h(C95) s转载 2013-04-18 09:44:11 · 953 阅读 · 0 评论 -
数组与指针归纳总结
1.用a[i]这样的形式对数组进行访问总是被编译器“改写”或解释为像*(a+1)这样的指针访问。2.指针始终就是指针。它绝不可以改写成数组。3.在特定的上下文中,也就是它作为函数的参数(也只有这种情况),一个数组的声明可以看作是一个指针。作为函数参数的数组(就是在一个函数调用中)始终会被编译器修改成为指向数组第一个元素的指针。4.当把一个数组定义为函数的参数时,可以选择把它定义为数组,原创 2013-04-19 09:19:07 · 605 阅读 · 0 评论 -
如何对数组进行初始化
嵌套的花括号进行初始化多维数组:如1short cantaloupe[2][5]={{10,12,3,4,一5},{31,22,6,0,-5},};如2intrhubarb[][3]={{0,0,0},{1,1,1},};建立指针数组进行初始化多维数组:如:char vegetables[ ][9] ={“carrot”, “cele转载 2013-04-19 10:49:46 · 1355 阅读 · 0 评论 -
一个有无限层间接引用的循环链表
/*Would run forever if you didn't limit it to MAX */#includestruct circ_list{ char value[ 3 ]; struct circ_list* next;}; struct circ_list suffixes[ ] = { "th" , &suffixes[ 1 ], //0th "st" ,转载 2013-04-19 11:15:51 · 644 阅读 · 0 评论 -
指针有一个下标[I]
如果指针有一个下标[I],就把指针的内容加上I作为地址,从中提取数据(例:二维数组,访问单个字符都是通过carrot[i][j]的形式,编译器在编译时会把它解析为*(*(carrot+i)+j)的形式)转载 2013-04-19 08:51:23 · 902 阅读 · 0 评论 -
编写可变参数c函数
前言:本文在很大程度上改编自网友kevintz的“C语言中可变参数的用法”一文,在行文之前先向这位前辈表示真诚的敬意和感谢。一、什么是可变参数我们在C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为:int printf( const char* format, ...);它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的(用三转载 2013-04-19 22:16:34 · 569 阅读 · 0 评论 -
数组名a 作为 左值和 右值的区别
比如:x=y左值:在这个上下文环境中,编译器认为x的含义是x所代表的地址。这个地址只有编译器知道,在编译的时候确定,编译器在一个特定的区域保存这个地址,我们完全不必考虑这个地址保存在哪里。右值:在这个上下文环境中,编译器认为y的含义是y所代表的地址里面的内容。这个内容是什么,只有到运行时才知道。C语言引入一个术语——“可修改的左值”。意思就是,出现在赋值符左边的符号所代表的地址转载 2013-04-20 17:06:41 · 2138 阅读 · 0 评论 -
const 与#define的比较
两种区别比较1.const常量有数据类型,而宏常量没有数据类型。2.编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查3.有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。常量定义规则1.需要对外公开的常量放在头文件中,不需要对外公开的常量放在定义文件的头部2.为便于管理,可以把不同模块的常量集中存放在一个公共的头文原创 2013-04-16 12:12:54 · 538 阅读 · 0 评论 -
以字符串为例比较指针与数组的特性
修改内容:字符数组a的容量是6个字符,其内容为hello\0。a的内容可以改变,如a[0]= ‘X’。指针p指向常量字符串“world”(位于静态存储区,内容为world\0),常量字符串的内容是不可以被修改的。从语法上看,编译器并不觉得语句p[0]= ‘X’有什么不妥,但是该语句企图修改常量字符串的内容而导致运行错误。char a[] = “hello”;a[0] = ‘X’;c转载 2013-04-21 20:48:16 · 643 阅读 · 0 评论 -
函数指针
注意区别:int *fun(char *);//这是一个返回整形指针的函数int (*fun)(char *);//这是一个函数指针函数指针使用:例子:int ptr; int fn(int); int(*fp)(int);fp = fn;//正确fp = fn(5);//错误fp = &ptr;转载 2013-06-09 21:55:44 · 567 阅读 · 0 评论 -
sizeof与数组名
#include int main(int argc, char *argv[]){ char a[] = "hello world"; char *p = a; printf("%d\n",sizeof(a)); // sizeof(a)= 12字节 printf("%c\n",*a);//结果:h printf("%d\n",sizeof(p)); // sizeof(a)原创 2013-04-16 11:27:18 · 3785 阅读 · 0 评论 -
调试技巧
1.调试标记适用预处理#define定义一个或多个调试标记,在代码中把调试部分适用#ifdef和#endif进行管理。当程序最终调试完毕后,只需要使用#undef标记。调试代码就会消失。常用的调试标记为DEBUG,语句序列:#define DEBUG#ifdef DEBUG调试代码#endif2.把变量和表达式转换成字符串可以使用字符串运算符来实现转换输出定义#de转载 2013-06-11 11:11:05 · 605 阅读 · 0 评论 -
编译器相关是一个问题!
1.不同的编译器对于数据类型的约定可能不同。char,short,int,long分别表示什么?2.不同的编译器在处理函数调用的传参与返回值可能不同。3.不同编译器在局部变量的处理上可能不同。4.不同编译器在组织结构体的时候,在存储的布局可能不同。5.不同编译器在缺省状态下的优化选项可能不同。原创 2013-06-11 10:59:47 · 639 阅读 · 0 评论 -
C语言中/*...*/
一些早期的编译器会删除每条注释中的所有字符,使得语句a/*...*/b = 0;可能被编译器理解成ab = 0;然而依据C标准,编译器必须用一个空格字符替换每条注释语句,因此上面提到的技巧并不行,我们实际上会得到下面的语句:a b = 0;另外/*.....*/不允许嵌套转载 2013-06-13 10:29:08 · 767 阅读 · 0 评论