摘要:#define HEX2ASCII(value, data)do{\ value = (value > 0x09)?(value+0x7):value; \ *data = value + 0x30; \ }while(0)#define ASCII2HEX(value, data)do{\ val...
阅读全文
摘要:int init_Department(manager *pt){ assert( NULL != pt && pt->p != NULL) ; pt->p->Manager = 10; pt->p->PM =100; pt->p->ProgrammerNo[...
阅读全文
摘要:char *strsep(char **stringp, const char *delim){ char *s; const char *spanp; int c, sc; char *tok; if ((s = *stringp)== NULL) re...
阅读全文
摘要:1 /* 2 * 详细运行过程: 本程序实现的是对链表的简单的操作,即链表的增 删 改 查 销毁 初始化 3 * 运用面向对象的思想,实现一个类op,op中包括了所有的链表操作方法 4 * 其他的程序调用op类,实现对表链表的操作 5 * 链表包括 6 * 面向对象,简单易学程序更加紧...
阅读全文
摘要:void my_strcpy(char *to,const char *from){ if('\0' == *from){ *to = '\0'; return ; } *to++ = *from++; my_strcpy(to,from);}//只拷贝n个字符void my_strncpy(char *to,const char* from,int n){ if( 0 == n || '\0' == *from){ *to = '\0'; return ; } *to++ = *from++; ...
阅读全文
摘要:关于字节对齐,有时候真的不是很清楚,每个编译器都有自己的规定,而大多数都遵循自然对齐:就是取该数据结构中所占内存空间最大的那个变量对齐(先检查占内存较大的那个的大小,而其后的变量则向其靠齐)typedef struct aa{ char a; short b; }_aa;_aa A;A.a='1';A.b=7788;sizeof(A)? 答案为4.他们怎么存放的?小端模式下: --------0x0 a | '1'|0x1 b | 88 |0x2 | 77 |0x3 | * | --------那么这个呢?typedef struct _aa{ char ...
阅读全文
摘要:标准库里面提供的offsetof(t,m)宏,用来计算两个变量在内存中的地址偏移量#include //原型:#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)/*#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)对这个宏的讲解我们大致可以分为以下4步进行讲解:1、( (TYPE *)0 ) 0地址强制 "转换" 为 TYPE结构类型的指针;2、((TYPE *)0)->MEMBER 访问TYP
阅读全文
摘要:在学习C语言和linux的时候,遇到了一些常见问题、题目,有些很简单,有些容易出错,本人水平有限,未免会出错,今天有时间,就将以前做的笔记,一一拿出来,写写blog。sizeof()和 strlen()的区别? 首先sizeof()是C语言提供的一个运算符,不是函数!它的作用主要是获得一个类型 或者一个对象里面内容的空间大小。 strlen()是一个标准库函数函数,用于计算一个字符串的长度,但是不把字符 '\0'计算在内。如char *buf="hello,world"strlen(buf)=11 sizeof(buf)=4 看看:sizeof( 2 + 3
阅读全文
摘要:扑克牌洗牌是我们生活中比较喜欢玩的一个游戏。那么我们有没有什么办法自己设计一个扑克牌洗牌的方法呢?在c运行库当中有一个随机函数rand,它可以生成0~32767之间的任意数。那么有没有可能利用这么一个函数对我们扑克牌进行随即洗牌呢? 在这里我抛砖引玉一下,谈一谈自己目前已经看到的两个算法。欢迎朋友们谈一谈其他的方法。随机数洗牌1)任意洗牌 步骤如下所示: a)首先生成一个数组,大小为54,初始化为1~54 b)按照索引1到54,逐步对每一张索引牌进行洗牌,首先生成一个余数 pos1 = rand %54,pos2=rand %54,那么我们的索引牌就和这两个余数牌进...
阅读全文
摘要:库函数中有atoi函数,用意是将字符形式输入的数据转换成数字,而库函数有没有提供一个将数字转换成字符的函数呢?答案是有的,而且功能很是强大,那就是sprintf()、snprintf()格式化转换函数,它的原型是:int sprintf(char *buf,const char *format,...) int snprintf(char *buf,int size,const char *format,...) 以上都是将数字转换成字符的形式的标准库函数。那么有没有别的自己实现的函数呢?好看看下面递归实现的:void _itoa(int value,char *str,int radix..
阅读全文
摘要:/*怎么理解排序二叉树呢?在二叉树的基本定义上增加两个基本条件: (1)所有左子树的节点数值都小于此节点的数值; (2)所有右节点的数值都大于此节点的数值。 */ 1 /************************头文件部分**************************/ 2 /******************************************************** 3 filename :tree_head.h 4 time :2013-11-13 5 copyrignt:none 6 author :cheng 7 ***...
阅读全文
摘要:高效的程序离不开内存的有效管理。在有效的内存资源的前提下,有效的对内存管理的好处不少:减少内存分配、回收开销、避免内存碎片、定位内存位置、方便内存整理、跟踪内存使用等等。V8 的堆内存Heap用于存预编译的code、JS对象内存分配、运行上下文对象分配、垃圾回收等。试题1:1 void test1()2 {3 char string[10];4 char *str1 = "0123456789";5 strcpy( string, str1 );6 }试题2: 1 void test2() 2 { 3 char string[10], str1[10]; 4 i...
阅读全文
摘要:前面我们讲到了容器,今天我们接着讨论另外一种数据结构:堆栈。堆栈几乎是程序设计的命脉,没有堆栈就没有函数调用,当然也就没有软件设计。那么堆栈有什么特殊的属性呢?其实,堆栈的属性主要表现在下面两个方面:1)堆栈的数据是先入后出2)堆栈的长度取决于栈顶的高度那么,作为连续内存类型的堆栈应该怎么设计呢?大家可以自己先试一下:#ifndef _stack_h#define _stack_h#include #include #define EMPTYSTACK -1#define MINSTACKSIZE 5typedef struct stackRecord{ int capacity; int t
阅读全文
摘要:在嵌入式开发当中,做数据运算(乘、除)等表达式时,移位操作是工程师们的最爱。但是也要非常谨慎,比如有符号数和无符号数、变量的取值范围。来看看这样一段小代码:#include #include static void divide_by_two(int num) { while (num){ printf("%d\n", num); num /= 2; } } int main(void) { int num; scanf("%d", &num); divide_by_two(num); return 0;...
阅读全文
摘要:C语言也能面向对象?不是C++是面向对象的么?其实C语言也能抽象成简单的面向对象方法,在Linux内核源码当中,底层的驱动代码、文件系统等皆采用了面向对象的封装技术,这样的好处是将客观的东西抽象出来,以接口的方式管理。 C++完全包容C语言的语法特点,C++中类:class和C语言中的结构体:struct是等效的,不过C++是一种完全面向对象的模式,其中域、对象名,都封装在类里面,而C语言没有明确规定,只是结构体是一种根据设计需要来构造的一种特殊的数据类型。C++中每个类都提供一个默认的构造函数和析构函数(当然也可以自定义一个构造函数)。下面是用纯C语言实现一个C++的vector容器:...
阅读全文
摘要:在上一篇中介绍了字符串拷贝的递归与非递归的实现,这里就不在赘述递归原理。递归求字符串长度_strlen:1 int _strlen(const char *src)2 { 3 if( src == NULL || *src == '\0') 4 return 0;5 6 return (_strlen(++src)+1); 7 } 分析:统计字符串长度的时候,'\0'是不统计的,也就是说遇到'\0'函数就停止递归调用。return (_strlen(++src)+1); 这个语句意思就是*src不为'\0'长度就加上一个1,有多少
阅读全文
摘要:初学递归的时候,觉得很抽象,不好分析,确实如此,尤其是有些时候控制语句不对,导致程序进去无限次的调用,更严重的是栈溢出。既要正确的控制结束语句,又要有正确的进入下次递归的语句,还要有些操作语句......。所以要使用递归,必须每一层的思路要相当清晰。而循环和递归还是挺类似的说,循环的次数可以近似的理解为要递归是次数。那么下面我们看看递归和循环的区别:1.递归实现strcpy函数:1 void _strcpy(char *to,const char *from)2 {3 if('\0' == *from){ 4 *to = '\0';5 return ;6 }7
阅读全文