2012年9月29日

C语言学习笔记(六):《C primer plus》与《C和指针》笔记

摘要: memcpy须确保没有重叠区域,memmove无此规则。restrict可用于指针,表明指针是访问一个数据对象的唯一且初始的方式。例子:intar[10];int*restrictrestar=(int)malloc(10*sizeof(int));int*par=ar;intn;for(n=0;n<10;n++){par[n]+=5;restar[n]+=5;ar[n]*=2;par[n]+=3;restar[n]+=3;}restar是访问它所指向数据块的唯一初始方式,编译器可以用具有同样效果的一条语句来代替包含restar的两个语句:restar[n]+=8;而将两个par语句精简 阅读全文

posted @ 2012-09-29 15:32 Chris-Lin 阅读(409) 评论(0) 推荐(0) 编辑

C语言学习笔记(五):《C语言深度剖析》笔记

摘要: register变量必须是能被cpu寄存器所接受的类型。此变量必须是一个单个的值,并且其长度应小于或等于整形的长度,而且此变量可能不存放在内存中,所以不能用取址运算符“&”来获取register变量的地址。静态全局变量,作用域仅限于变量被定义的文件中,其他文件即使用extern也没法使用。由于被static修饰的变量总是存在内存的静态区,所以即使这个函数运行结束,这个静态变量的值也不会被销毁,函数下次使用时仍然能用到这个值。在多重循环中,尽可能把最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。把循环嵌套控制在3层以内(有研究表明,循环嵌套超过3层时,程序员对循 阅读全文

posted @ 2012-09-29 15:27 Chris-Lin 阅读(207) 评论(0) 推荐(0) 编辑

C语言学习笔记(四):Linux下C语言的编译过程

摘要: #include<stdio.h>intmain(){printf(“Hello,world.\n”);return0;}通常我们使用gcc来生成可执行程序,命令为:gcchello.c,默认生成可执行文件a.out其实编译(包括链接)的命令:gcchello.c可分解为如下4个大的步骤:预处理(Preprocessing)编译(Compilation)汇编(Assembly)链接(Linking)1.预处理(Preproceessing)预处理的过程主要处理包括以下过程:将所有的#define删除,并且展开所有的宏定义处理所有的条件预编译指令,比如#if#ifdef#elif#e 阅读全文

posted @ 2012-09-29 15:22 Chris-Lin 阅读(314) 评论(0) 推荐(0) 编辑

C语言学习笔记(三):数据对齐

摘要: 数据对齐(在没有#pragmapack宏的情况下):原则1、数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。原则2、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。原则3、收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。(有#pragmapack宏的情况下):原则1与原则3无效,但GCC下最大还是以四位对齐,超过四 阅读全文

posted @ 2012-09-29 15:15 Chris-Lin 阅读(273) 评论(0) 推荐(0) 编辑

C语言学习笔记(二):define和typedef以及printf和scanf族函数

摘要: define和typedef预处理指令执行的仅仅是低级的记号替换,某些时候就会暴露出问题:#definechar*String;StringinputFileName;预处理程序把“#define”指令后面的文本中所以的记号“String”替换成“char*”,所以上面的代码可以工作。但如果写成:#definechar*String;StringintputFileName,OutputFileName;经过替换,上面的语句变成:char*inputFileName,OutputFileName;这就是#define的局限!typedef就没这个问题,因为typedef是由编译器进行语法分析的 阅读全文

posted @ 2012-09-29 15:09 Chris-Lin 阅读(387) 评论(0) 推荐(0) 编辑

C语言学习笔记(一):数组初始化的一种形式及C-V限定词

摘要: 数组:#include<stdio.h>intmain(){ inti,a[]={8,9,10,11,56,13,[0]=2,12,18,23,[1]=5,6}; for(i=0;i<sizeof(a)/sizeof(int);i++) printf("a[%d]=%d\n",i,a[i]); printf("length=%d\n",sizeof(a)/sizeof(int));}运行结果:(1)如果在一个指定初始化项目后跟有不止一个值,例如:[0]=2,12,18,23,则这些数值将用来对后续的数组元素初始化。即:[0]=2,则[1 阅读全文

posted @ 2012-09-29 14:55 Chris-Lin 阅读(194) 评论(0) 推荐(0) 编辑

导航