随笔分类 -  C

摘要:【问题描述】常见下列几组定义:fgets()/fputs(),gets()/puts(),getchar()/putchar(),fgetc()/fputc(),getc()/putc(),fscanf()/scanf()/sscanf(),它们之间有何区别?【分析】1 函数声明Glibc-2.3.6/Libio/stdio.hfgets()/fputs()extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream);extern int fputs (__const char *__restrict 阅读全文
posted @ 2012-04-17 10:54 j2ee技术 阅读(393) 评论(0) 推荐(0)
摘要:【问题描述】在写嵌入式的程序中,常会将数据定义为unsigned int,这样定义有什么好处呢?下面从逻辑右移和算术右移的角度进行分析。【分析】1 逻辑右移和算术右移逻辑右移,移走的位填充为0;算术右移,移走的位填充与符号位有关,例如如果为负数,则移走的位填充为1。2 unsigned int 和 intC语言的标准指出,无符号数执行的所有移位操作都是逻辑的,而对于有符号数,采用哪种方式取决于编译器。算术左移和逻辑左移是相同的,而算术右移和逻辑右移,取决于符号位。因此,一个程序如果使用了有符号数,是不可移植的。嵌入式的程序通常采用交叉编译开发,如果定义为有符号的,就无法保证右移操作能跨平台使用 阅读全文
posted @ 2012-03-23 09:56 j2ee技术 阅读(678) 评论(0) 推荐(0)
摘要:【问题描述】在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 copy the string from * @count: The maximum number of bytes to copy * * The result is not %NUL-terminated if the 阅读全文
posted @ 2012-03-11 11:03 j2ee技术 阅读(242) 评论(0) 推荐(0)
摘要:【问题描述】看一个常见的实例,我们经常进行类似于下例的初始化操作:char *message = "Hello C";书本告诉我们上述操作等价于:char *message; message = "Hello C";注意:实际上不能这么做,因为message指针未分配内存。问题:为什么不是char *message; *message = "Hello C";下面从指针的角度分析。【分析】1 指针常量和常量指针我们常看到这两个概念,很容易混淆,其实很简单,看下面两组用const关键字修饰的概念:Type * constpointer 阅读全文
posted @ 2012-02-12 10:52 j2ee技术 阅读(150) 评论(0) 推荐(0)
摘要:【问题描述】 scanf函数与printf函数的转换说明符几乎一致,都可以使用%c,%d,%e,%f,%g,%a,%p,%o等。那么他们的转换说明符有何区别?【解析】printf函数中将%f,%e,%E,%g,%G同时用于float类型和double类型,而scanf只把它们用于float类型,而用于double类型时要求使用l修饰符,即使用类似于%le的转换说明符。这就意味着,如果将printf函数的格式代码照搬于scanf函数,当输入为double类型时,若没有l修饰符修饰,则会出现精度截短的现象。 阅读全文
posted @ 2012-02-10 09:24 j2ee技术 阅读(268) 评论(0) 推荐(0)
摘要:【问题描述】看下列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 (* func)(int a, int b);这4组概念怎样区分呢?下面从结合性的角度出发,来分析考虑。【分析】(1)*dates+2*(dates+2)第一组概念,很多朋友都已经弄清楚了。从结合性看上述概念,*(间接访问)操作符优先于+(加法)操作符。故*dates+2等价于(*dates)+2。也就是先对指针dates解引 阅读全文
posted @ 2012-01-05 10:59 j2ee技术 阅读(368) 评论(0) 推荐(0)
摘要:【问题描述】单链表结构中有一个指向该结构的next节点指针,为什么要有这个节点指针呢?【分析】两种情况:(1) 调用1次malloc,要求保存300个相同的结构;(2) 调用300次malloc,要求保存1个相同的结构;这两种情况有什么区别呢?第一种情况将分配一个连续的内存块,通过数组符号(记录了首地址),就可以访问每个结构。而第二种情况,分配的内存不是连续的,这意味着这些结构不一定会被连续存储,因此,不能通过数组符号实现对每个结构的访问。包括单链表的链表结构就属于第二种情况,为了实现对整个结构的访问,单链表有个聪明的办法,那就是在每个结构中,利用一个名为next的指针,记录下一个结构的首地址 阅读全文
posted @ 2012-01-02 09:42 j2ee技术 阅读(527) 评论(0) 推荐(0)
摘要:看一个例子char str[6]={'h','e','l','l','o','\0'};printf("%d\n",strlen(str));这个例子是求取字符串长度,结果为5。为什么不是6呢?原因是NUL('\0')不是字符串的一部分。看看字符串的定义就明白了。【定义】字符串就是一个零串或多个字符,并且以一个位模式为全0的NUL字节结尾。NUL字节是字符串的终止符,但它本身并不是字符串的一部分。 阅读全文
posted @ 2011-12-25 09:32 j2ee技术 阅读(181) 评论(0) 推荐(0)
摘要:1 重载【特征】针对同一类,同函数名,参数不同【举例】class TestBase{...private: void test(); void test(int, int); virtual test(float, float);}2 覆盖【特征】针对不同的具有继承关系的类。函数名相同,参数相同,且基类声明有virtual关键字【举例】class Test : public TestBase{...private: void test(float, float);//注意基类TestBase中有virtual关键字}3 掩藏【特征】针对不同的具有继承关系的类。在不同的类中,函数名相同,参数不同 阅读全文
posted @ 2011-12-24 10:58 j2ee技术 阅读(142) 评论(0) 推荐(0)
摘要:C语言中所有的参数都是传值调用,意味着函数将获得参数值的一份拷贝。函数可以放心的修改这份拷贝,而不必担心会修改实际传递给他们的形参。但这种方式,有时候也会带来麻烦。如下例交换函数:void swap(int a, int b){ int temp; temp = a; a = b; b = temp;}函数调用如下:int main(void){ int x = 5, y = 10; swap(x,y); printf("x = %d, y = %d", x, y); return 0;}执行这个函数后,x,y并没有像预期的进行交换。原因如下:执行swap(x,y)时,sw 阅读全文
posted @ 2011-12-24 10:37 j2ee技术 阅读(239) 评论(0) 推荐(0)
摘要:【问题描述】设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; int temp = i;【原则2】++操作对象必须是变量例:int a = 1,b = 1, c=0; c=((a++)++)+b; //错误的 a++ 使a等于a+1但返回的是a以前的值,一个数值不是变量,不能在++了,就是错误c21 阅读全文
posted @ 2011-11-09 10:34 j2ee技术 阅读(223) 评论(0) 推荐(0)
摘要:【问题描述】写一函数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;} 阅读全文
posted @ 2011-11-09 10:26 j2ee技术 阅读(148) 评论(0) 推荐(0)
摘要:int a;unsigned int b;printf("%d %d\n", a>=0 && ~a>=0, b>=0 && ~b>=0); 阅读全文
posted @ 2011-11-09 10:22 j2ee技术 阅读(372) 评论(0) 推荐(0)
摘要:return !(x&(x-1)) 阅读全文
posted @ 2011-11-09 10:21 j2ee技术 阅读(363) 评论(0) 推荐(0)
摘要:已知一个数组table,用一个宏定义,求出数据的元素个数。#define length(table) (sizeof(table)/sizeof(table[0])) 阅读全文
posted @ 2011-11-09 10:18 j2ee技术 阅读(206) 评论(0) 推荐(0)
摘要:一 原理由于存储变量时地址对齐的要求,编译器在编译程序时会遵循两条原则:【原则1】结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)【原则2】结构体大小必须是所有成员大小的整数倍。结构体总大小等于最后一个成员的偏移量加上其大小二 实例例1 计算结构体的大小struct A{int a;char b;char c;};【解析】利用sizeof 计算,结果为8。记偏移量为ref,大小为size:struct A{int a;//ref_a=0,size_a=4char b;//ref_b=ref_a+size_a=4,size_b=1char c;//ref_c=ref_b 阅读全文
posted @ 2011-10-27 15:48 j2ee技术 阅读(138) 评论(0) 推荐(0)
摘要:1 函数原型及用法(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);【解析】memcpy用于内存拷贝,在执行操作时,如果src和dst的地址重叠,拷贝会发生错误。C99中引入关键字restrict进行了内存访问限制。(2) memmove【函数原型】void *memmove(void *dst, const void *src, size_t 阅读全文
posted @ 2011-10-16 14:37 j2ee技术 阅读(294) 评论(0) 推荐(0)