C
文章平均质量分 60
tandesir
这个作者很懒,什么都没留下…
展开
-
写一语句实现x是否为2的若干次幂的判断
return !(x&(x-1))原创 2011-11-09 10:21:09 · 3724 阅读 · 0 评论 -
[荐]内存字节对齐
一 原理由于存储变量时地址对齐的要求,编译器在编译程序时会遵循两条原则:【原则1】结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)【原则2】结构体大小必须是所有成员大小的整数倍。结构体总大小等于最后一个成员的偏移量加上其大小二 实例例1 计算结构体的大小struct A{int a;char b;char c;};【解析原创 2011-10-27 15:48:29 · 567 阅读 · 0 评论 -
文件输入/输出函数对比
【问题描述】常见下列几组定义:fgets()/fputs(),gets()/puts(),getchar()/putchar(),fgetc()/fputc(),getc()/putc(),fscanf()/scanf()/sscanf(),它们之间有何区别?【分析】1 函数声明Glibc-2.3.6/Libio/stdio.hfgets()/fputs()extern cha原创 2012-04-17 10:54:26 · 1248 阅读 · 0 评论 -
求数组的长度?
已知一个数组table,用一个宏定义,求出数据的元素个数。#define LENGTH(array) (sizeof(array)/sizeof(array[0]))原创 2011-11-09 10:18:37 · 965 阅读 · 0 评论 -
传值和传址
【更新】 2012-7-11,添加特例分析C语言中所有的参数都是传值调用,意味着函数将获得参数值的一份拷贝。函数可以放心的修改这份拷贝,而不必担心会修改实际传递给他们的形参。但这种方式,有时候也会带来麻烦。如下例交换函数:void swap(int a, int b){ int temp; temp = a; a = b; b = temp;}函数调用原创 2011-12-24 10:37:05 · 8275 阅读 · 2 评论 -
第21届国际C语言混沌代码大赛
【链接地址】http://www.ioccc.org/years.html原创 2012-10-29 20:11:42 · 1887 阅读 · 0 评论 -
进程和线程
【描述】线程和进程是一个老生常谈的话题,线程和进程的区别和优缺点有哪些?线程最多可以开多少个?【解析】1 区别 线程是CPU调度的最小单位,进程是资源分配的最小单位。进程是线程的容器,真正完成代码执行的是线程,而进程则作为线程的执行环境。在32位的Windows操作系统中,系统要为每一个进程分配私有的232=4GB的虚拟地址空间。但实际上只有2GB的空间被用户分区使用,另外2GB空间被原创 2012-10-15 10:28:54 · 4951 阅读 · 3 评论 -
for语句的执行顺序
【问题描述】for循环是C语言中常见的循环语句,for语句括号中的部分,其执行顺序是怎样?【解析】for语句的结构如下所示:for(初始化;条件;调整){示例语句;} 第一次顺序:初始化 ->条件->示例语句第二次顺序:调整->条件->示例语句第三次顺序:调整->条件->示例语句...以此类推。 【示例】看下面一个示例:for(i =原创 2012-11-23 16:05:46 · 8408 阅读 · 0 评论 -
简单工厂模式C语言实现
【说明】简单工厂模式的C语言实现,改写自http://blog.csdn.net/sx_wpc/article/details/7645062一文的代码。【代码清单】typedef.h#ifndef __TYPEDEF_H__#define __TYPEDEF_H__#include #include #ifdef __cplusplusextern "C"原创 2013-03-04 20:25:19 · 6022 阅读 · 0 评论 -
适配器模式C语言实现
【说明】适配器模式的C语言实现,改写自http://blog.csdn.net/sx_wpc/article/details/7688128一文的代码。【代码清单】typedef.h#ifndef __TYPEDEF_H__#define __TYPEDEF_H__#include #include #ifdef __cplusplusextern "C"原创 2013-03-06 16:36:29 · 4103 阅读 · 1 评论 -
工厂方法模式C语言实现
【说明】工厂方法模式的C语言实现,参考http://blog.csdn.net/sx_wpc/article/details/7645062一文的代码。【代码清单】typedef.h#ifndef __TYPEDEF_H__#define __TYPEDEF_H__#include #include #ifdef __cplusplusextern "C"原创 2013-03-05 14:41:28 · 3018 阅读 · 0 评论 -
策略模式C语言实现
【说明】策略模式的C语言实现,实现了3种排序算法的灵活切换。【代码清单】typedef.h/* Author : tandesir Time : 2013-03-09 借鉴Li XianJing部分代码, 感谢 Li XianJing 欢迎访问 http://blog.csdn.net/tandesir*/#ifndef __TYPEDEF_H__#de原创 2013-03-09 17:47:59 · 4225 阅读 · 0 评论 -
[荐]memcpy、memmove、strcpy的区别?
【更新说明】2012-3-131 函数原型及用法(1) memcpy【函数原型】void *memcpy(void * dst, const void * src, size_t count);C99原型:void *memcpy(void * restrict dst, const void *restrict src, size_t count);【解析】me原创 2011-10-16 14:37:11 · 1174 阅读 · 0 评论 -
[荐]重载、覆盖和隐藏
【更新】2012-5-30,添加示例代码2012-6-1,更新示例代码1 重载(只是一种语法规则,与多态无关,有书籍将其归为静态多态,采用静态联编的方式,即联编出现在编译连接阶段)【特征】针对同一类,同函数名,参数不同【举例】class TestBase{...private: void test(); void test(int, int); vi原创 2011-12-24 10:58:24 · 987 阅读 · 2 评论 -
[荐]从结合性看指针
【更新】2012-5-17,增加内容【问题描述】看下列4组概念:(1)*dates+2*(dates+2)(2)*str++;(*str)++;*++str;*(++str);(3)const int * pt;int * const pt;(4) int * func(int a, int b);int (* fun原创 2012-01-05 10:59:13 · 1851 阅读 · 2 评论 -
判断二进制数1的个数
【问题描述】 写一函数int count(char c)返回字符c的二进制数所含1的个数,例如c=3,其二进制数为00000011,那么此函数返回2。【解析】int count(char a){ int sum=0; char a=6; int i; for(i=7;i>=0;i--) { sum+=((a>>i)&0x01); } return sum原创 2011-11-09 10:26:57 · 2344 阅读 · 1 评论 -
i++和++i
【问题描述】设int arr[] = {6,7,8,9,10}; int *prtr = arr; *(ptr++) += 123; printf(” %d,%d “,*ptr,*(++ptr)); 输出结果为( 8,8 )【解析】(1) ++i和i++的区别【原则1】i++;相当于int temp = i; i = i +1;++i;相当于i = i+1;原创 2011-11-09 10:34:21 · 1208 阅读 · 0 评论 -
如何判别一个数是unsigned
int a;unsigned int b;printf("%d %d\n", a>=0 && ~a>=0, b>=0 && ~b>=0);原创 2011-11-09 10:22:05 · 5600 阅读 · 2 评论 -
单链表中为什么要有next指针?
【问题描述】 单链表结构中有一个指向该结构的next节点指针,为什么要有这个节点指针呢?【分析】两种情况:(1) 调用1次malloc,要求保存300个相同的结构;(2) 调用300次malloc,要求保存1个相同的结构;这两种情况有什么区别呢?第一种情况将分配一个连续的内存块,通过数组符号(记录了首地址),就可以访问每个结构。而第二种情况,分配的内存不是连续的,这意味着这原创 2012-01-02 09:42:58 · 6453 阅读 · 3 评论 -
scanf与printf转换说明符区别
【问题描述】 scanf函数与printf函数的转换说明符几乎一致,都可以使用%c,%d,%e,%f,%g,%a,%p,%o等。那么他们的转换说明符有何区别?【解析】printf函数中将%f,%e,%E,%g,%G同时用于float类型和double类型,而scanf只把它们用于float类型,而用于double类型时要求使用l修饰符,即使用类似于%le的转换说明符。这就意味着,如果将pr原创 2012-02-10 09:24:35 · 1721 阅读 · 0 评论 -
小心strncpy!
【问题描述】在Linux-2.6.23中strncpy的函数原型如下:Linux-2.6.23/lib/string.h(line110-134)/** * strncpy - Copy a length-limited, %NUL-terminated string * @dest: Where to copy the string to * @src: Where to原创 2012-03-11 11:03:09 · 1170 阅读 · 0 评论 -
逻辑右移和算术右移
【问题描述】在写嵌入式的程序中,常会将数据定义为unsigned int,这样定义有什么好处呢?下面从逻辑右移和算术右移的角度进行分析。【分析】1 逻辑右移和算术右移逻辑右移,移走的位填充为0;算术右移,移走的位填充与符号位有关,例如如果为负数,则移走的位填充为1。2 unsigned int 和 intC语言的标准指出,无符号数执行的所有移位操作都是逻辑的,而对于有符号数,采原创 2012-03-23 09:56:12 · 18298 阅读 · 0 评论 -
字符串长度
【更新】2012-7-9,增加示例【问题描述】看一个例子char str[6]={'h','e','l','l','o','\0'};printf("%d\n",strlen(str));这个例子是求取字符串长度,结果为5。为什么不是6呢?原因是NUL('\0')不是字符串的一部分。看看字符串的定义就明白了。【定义】字符串就是一个零串或多个字符,并且以一个位模式为全0的NU原创 2011-12-25 09:32:43 · 8759 阅读 · 1 评论 -
C与泛型
【问题描述】泛型是一种特殊的类型,它把指定类型的工作推迟到客户端代码声明并实例化类或方法的时候进行。泛型旨在解决函数名字冲突的问题。一般认为泛型是高级语言的能力,泛型的实现一般借助高级语言的模板概念。C语言是否能实现泛型呢?答案是能,不过比高级语言困难得多。下面总结两种泛型的实现方法。【解析】编译环境:Fedora 10, gcc版本gcc4.3.21 利用函数指针实现泛型【代原创 2012-08-06 10:39:01 · 1360 阅读 · 0 评论 -
动态内存分配小技巧
【问题描述】动态分配内存是C语言的重要组成部分,如何安全有效的进行动态内存分配呢?下面对一些技巧进行小结。【小技巧】1 安全分配内存(malloc)malloc的函数原型如下:void *malloc(size_t size);在分配内存时,常采用类似如下代码,分配25个单位的int类型内存:p = malloc(25*sizeof(int));这个代码乍看起来原创 2012-07-23 10:45:04 · 1091 阅读 · 0 评论 -
[荐]字符串与指针常量
【更新说明】2012-3-16【问题描述】看一个常见的实例,我们经常进行类似于下例的初始化操作:char *message = "Hello C";书本告诉我们上述操作等价于:char *message;message = "Hello C";注意:实际上不能这么做,因为message指针未分配内存。问题:为什么不是char *message;*mess原创 2012-02-12 10:52:03 · 1405 阅读 · 0 评论 -
建造模式C语言实现
【说明】建造模式的C语言实现,改写自http://blog.csdn.net/sx_wpc/article/details/7659179一文的代码。【代码清单】typedef.h#ifndef __TYPEDEF_H__#define __TYPEDEF_H__#include #include #ifdef __cplusplusextern "C" {原创 2013-03-10 16:25:56 · 3025 阅读 · 0 评论