中程在线(北京)科技有限公司内部教程注意保密Android高級課程AndroidNativeC语言教学C的起源-1970年代﹐李查(D.Richie)及汤普士(K.Thompson)任职于美国贝尔实验室(BellLabs)。汤普士正设计Unix操作系统﹐李查负责设计新语言来撰写Unix程序。新语言继承汤普士原设计的B语言﹐称为C语言。-数学函数(Function)观念﹐被应用到C语言中﹐成为C程序的基本组件。例如sin()、cos()等。在C的编程时,可自行定义函数,如:f(x)=x*x就是一个函数﹐括号内的x为参数。如果x值为5﹐f(5)=5*5=25﹔此时f(5)函数值是25。C的基本结构1.前置处理器(Preprocessor):-前置处理器的任务是﹕在编译(Compile)之前把原始程序先整合﹐再交给编译程序(Compiler)处理。C的特殊结构2.定义宏(Macro):-人有正名(本名)﹐也有别名﹐通常别名较亲切。程序内之常数或变量也能有涵意深刻之别名。令程序更有人情味﹐更亲切。有了别名﹐就可使用别名﹐亦可用本名。前置处理器(Preprocessor)将别名转成正名﹐才交由编译程序(Compiler)编译之。常数的别名(如PI)﹐通称为「宏常数」﹔若别名中含有参数(Argument)﹐就类似一般函数﹐通称为「宏函数」。#defineTRUE1#defineFALSE0#defineNewLine'\n'chardigit(chark){return((k='0'&&k='9')?TRUE:FALSE);}intmain(void){charch;while((ch=getchar())!=NewLine)if(digit(ch))printf(DIGIT\n);elseprintf(NotDigit\n);return0;}例如:这程序含三个宏常数──TRUE、FALSE及NewLine。TRUE代表1﹐使得程序的思路更清晰。FALSE及NewLine也有同样效果。前置处理器看到#define指示﹐就将TRUE还原为1﹐FALSE还原为0﹐且NewLine还原为'\n'。处理后的结果:chardigit(chark){return((k='0'&&k='9')?1:0);}intmain(void){intch;while((ch=getchar())!='\n')if(digit(ch))printf(DIGIT\n);elseprintf(NotDigit\n);return0;}──────────────────────#definemax(x,y)((x)(y)?(x):(y))#definemin(x,y)((x)(y)?(x):(y))#definesquare(x)((x)*(x))#definecube(x)((x)*(x)*(x))#defineabs(x)((x)0?-(x):(x))#definerecip(x)((float)(x)=1.0/(float)(x))#defineodd(x)((x)&1?1:0)#defineeven(x)((x)&1?0:1)─────────────────────────────写C程序时﹐常用下述宏函数﹕●max(x,y)拿两数相比﹐挑出较大者。●min(x,y)则挑出较小值。●square(x)求x的平方。●cube(x)求x的立方。●abs(x)求x的绝对值。●recip(x)求x的倒数。●odd(x)判断x是否为奇数。●even(x)判断x是否为偶数。随时可引用上述宏﹐创造更多宏。3.取销宏:-#define用来定义宏常数和函数。#undef指示恰好跟#define相反﹐用来取销已定义之宏常数或函数。intAdd(intx){return(x+x);}#defineAdd(x)((x)+10)intmain(void){intk=Add(8);#undefAddinth=Add(8);printf(k=%d,h=%d,k,h);return0;}例如:含入标头档(Header):-写程序时﹐若想用这心爱宏﹐有两种方法﹕1.把宏抄进C程序(*.c)中。2.把各宏归成「宏文件」﹐让程序含入之。这档案通称为「标头档」(HeaderFile)﹐/*Ex_macro.h*/#defineTRUE1#defineFALSE0#defineCR'\r'#definePI3.1416#defineEOF(-1)#defineSign(x)((x)0?FALSE:TRUE)#defineArea(r)((r)*(r)*PI)#defineAND&defineREALfloat例如:-此宏文件之个名字为﹕Ex_macro.h-在C程序中﹐利用#include来含入标头档/*Ex_macro.c*/#includestdio.h#includeEx_macro.hintmain(void){/*………*/}例如:#include是「含入」之意﹐其要求前置处理器并入标头档之内容﹐摆于#include指示的位置上。-标头文件的好处是﹕各程序(*.c)共享标头文件内之的宏。写复杂程序时﹐就得熟练运用标头档了。可随时修改标头文件内之宏﹐修改之后﹐再重新编译各模块(Module)即行了。4.条件性定义:条件性定义(ConditionalDefinition)指示有﹕#ifdef宏若已定义了此宏﹐就留下#ifdef与#endif间的指令﹔否则删去之。#ifndef宏若未定义过此宏﹐就留下#ifndef与#endif间的指令﹔否则删去之。#endif说明#ifdef及#ifndef之范围。#undef宏#define的相反动作──解除定义。#else可构成#ifdef~#else~#endif结构或是#ifndef~#else~#endif结构。5.指针(Pointer):-指针(Pointer)就是某个变量的地址(Address)﹐也就是说,它用来指向该变量。-有人说C并不好学﹐何以致之呢﹖其来自于C程序中充满着「指针」(Pointer)观念﹐而许多人认为指标很难缠。其实指标观念并不如想象中的麻烦﹐只是有点不习惯罢了。指针与数组:-指针能指向数组内之任一元素。可藉指针来存取数组内之元素。-所以﹐除了传统的数组存取方法之外﹐还可利用更有效率的指针处理方法。#includestdio.hintmain(void){intdata[3];int*px,*py;data[0]=5;data[1]=28;data[2]=78;px=&data[0];py=&data[1];data[2]+=*px+(*py)++;printf(%d,%d,%d\n,data[0],data[1],data[2]);return0;}例如:px=&data[0]叫px指向元素data[0]。既然px指向data[0]﹐就可用*px来代替data[0]﹐亦即可用*px来存取data[0]之内容。py=&data[1]令py指向data[1]元素﹐此时可用*py代替data[1]﹐用*py存取data[1]之内容。6.变量的储存种类:-在大家庭中﹐每人都有自己的财产﹐也有属于家庭的公家财产。在C程序(犹如大家庭)中﹐每个函数有自己的变量﹐也有属于整个程序的公家变量。私有财产属于个人﹐别人无权使用﹔同样地﹐私有变量属于函数﹐别的函数无权存取之。根据使用权限﹐变量可分为三类﹕1.自动(Automatic)变量隶属于一个函数﹐别函数无权使用。2.外部静态(ExternalStatic)变量隶属于一个原始程序文件(*.c)﹐该档内的各函数公用﹐但别文件内的函数无权使用。3.外部(External)变量各函数公用。7.结构(Struct):-结构能储存相关但不同型态之数据。例如structsmile{charsna;charsize;floatprice;};这说明了﹕smile结构内含3项数据──两项字符数据﹐另一项浮点数数据。8.动态内存分配:malloc()及free()-「动态」(Dynamic)的意思是﹕待程序执行时(Run-Time)才告诉计算机共需要多少内存空间﹐计算机依照需要立即分配空间﹐裨储存数据。这种空间﹐又称为「动态数组」(DynamicArray)。传统数组的优点是﹕简单易用﹐其弱点是﹕缺乏弹性﹐动态内存分配的方法恰补足此项弱点。。-malloc()和free()是最常用的动态内存分配函数。如果在执行时需要空间来储存数据﹐宜使用malloc()函数。-例如﹕ptr=malloc(100);这个指令要求计算机分配100bytes空间。malloc()函数会传回该空间的地址﹐且存入ptr内﹐于是ptr指向该空间。就可藉ptr指标来存取此空间的数据了。9.列举型态:-列举型态(EnumeratedDataType)是一堆常数的集合﹐这些常数称为「列举常数」(EnumeratedConstants)。例如﹕朴克牌有club、diamond、heart及spade四种牌﹐任意抽出一张﹐必定是上述4者之1。此时﹐可定义列举型态表达上述4种数据﹕enum朴克牌{club,diamond,heart,spade};enumweek_day{monday,tuesday,wednesday,thursday,friday,saturday,sunday};例如﹕-enumweek_day列举型态内含monday、tuesday、…、sunday共7个常数﹐计算机分别以0、1、…、6代表这7个列举常数。列举型态把相关常数组成一个集合﹐计算机把列举常数逐一编号。程序里可尽情地使用列举常数名称(如monday)﹐裨增加程序的可读性。。因之﹐enumweek_day列举型态相当于:#definemonday0#definetuesday1#definewednesdy2.....#definesunday610.typedef指示:-typedef指示为型态取个传神的名字。例如﹕enumpa{club,diamond,heart,spade};这定义了enumpa为列举型态﹐enumpa为此型态之名称。如果您不喜欢这名称﹐可利用typedef指令取个较传神的别名。例如﹕typedefenumpaCARD;此时﹐CARD是一种型态了﹐为enumpa的别名。于是宣告指示enumpax;相当于CARDx;