播客基础2014.818推-c讲义_第1页
播客基础2014.818推-c讲义_第2页
播客基础2014.818推-c讲义_第3页
播客基础2014.818推-c讲义_第4页
播客基础2014.818推-c讲义_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目第一个C语言 O INCLUDE头文件包 MAIN函 注 {}括号和代码 ...............................................................................................................................13C语言自定义名字的要 RETURN语 C语言的编 编译过 GCC编译选 PRINTF执行原 CPU32位64位简 C语言中的数据类 常 字符串常 位,字节, 二进 十进 八进 十六进 字 SIZEOF关键 十进制,二进制,八进制,十六进 INT类 int常量,变 printf输出int printf输出八进制和十六进 short,long,longlong,unsigned 整数溢 CHAR类 char常量,变 不可打印char转义 char和unsigned 浮点FLOAT,DOUBLE,LONGDOUBLE类 浮点常量,变 printf输出浮点 类型限 字符串格式化输出和输 字符串在计算机内部的方 PRINTF函数,PUTCHAR函 SCANF函数与GETCHAR函 运算符表达式和语 基本运算 - - 逗号运算 运算符优先 复合语 类型转 条件分支语 关系运算 关系运算符优先 逻辑运算 IF IFELSE SWITCH与 条件运算符 循环语 DO 循环嵌 整数在计算机内部的方 原 反 补 数 一维数组定义与使 数组在内存的方 一维数组初始 二维数组定义与使 二维数组初始 字符串与字符数 字符数组定 字符数组初始 字符数组使 随机数产生函数RAND与 用SCANF输入字符 字符串的结束标 字符串处理函 fgets函 puts函 fputs函 strlen,字符串长 strcat,字符串追 strncat,字符串有限追 strcmp,字符串比 strncmp,字符串有限比 strcpy字符串拷 strncpy字符串有限拷 sprintf,格式化字符 strchr查找字 strstr查找子 strtok分割字符 atoi转化为 atof转化为 atol转化为 函 函数的原型和调 函数的形参与实 函数的返回类型与返回 MAIN函数与EXIT函 函数的递 递归的过程分 递归的优 递归的缺 多个源代码文件程序的编 头文件的使 #include与#define的意 #ifndef与 函数的二进制封 exe加载dll的说 动态库中代码与位置无关的说明 linux编写so文件的方 linux使用 配置profile文件可以在当 下查找so文 作业描 指 指 指针的概 指针变量的定 野指 &取地址运算 无类型指 指针的兼容 指针与数组的关 通过指针使用数组元 指针数 数组指 指向指针的指针(二级指针 指针变量做为函数的参 一维数组名作为函数参 二维数组名作为函数参 指向二维数组的指 指向常量的指针与指针常 const关键字保护数组内 指针做为函数的返回 指向函数的指 把指向函数的指针做为函数的参 指针运 指针小 字符指针与字符 指针和字符 通过指针字符串数 函数的参数为CHAR 指针数组做为MAIN函数的形 内存管 作用 auto自动变 register寄存器变 代码块作用域的静态变 代码块作用域外的静态变 全局变 外部变量与extern关键 全局函数和静态函 内存四 代码 静态 栈 堆 堆的分配和释 结构体,联合体,枚举与 结构 定义结构体struct和初始 结构体成 结构体的内存对齐模 指定结构体元素的位字 结构数 嵌套结 结构体的赋 指向结构体的指 指向结构体数组的指 结构中的数组成员和指针成 在堆中创建的结构 将结构作为函数参 结构,还是指向结构的指 远指针与近指 联合 枚举类 枚举定 默认 通过TYPEDEF定义函数指 文件操 二进制和文本模式的区 GETC和PUTC函 EOF与FEOF函数文件结 STAT函 FSEEK函 L函 FGETPOS,FSETPOS函 FFLUSH函 FREAD和FWRITE函 FREAD与 作 第一个c语言 oinclude头文件头文件包含,写法#include文件名main函这个就是C语言程序的 ,所有的C程序都是从main开始执行,一个C的源程序必须有一个main函数,也只能有一个main函数注//注释一/**/{}括号和代码C语言规定,所有的变量和函数必须先,然后才能使用C语言自定义名字的要return语Creturnmainreturn,代表整return代表函数的返回值,如果返回类型是void,可以直接写return,而不需要返回任何C语言的编编译过gcc编译选-o-E代表预预编译处理include的本质就是简单的将include中的文件替换到c如果include包含的头文件在系统 下那么就用#include<>,如果包含的文件在当前目录下,那么用#inlclude“”-cprintf执行原CPU3264位简8bit48 16 ALAH32 64C语言中的数据类常常量就是在程序中不可变化的量,#define的本质就是简单的文本替通过#define定义的常量,在C语言里面一般叫宏定const定义一个变量,但是这个变量的值只能在定义的时候赋予,之后就不可以修改对于const类型的变量,一定要在定义的时候给变量赋初值,不然定义之后就无法赋值了字符串在C语言当中“”的字符串都是字符串常量,常量一旦定义也是不可以被修改的位,字节,位计算机内部都是二进制的,一个二进制的位,就叫做一个bit,就是一二进1012这个数的2几次幂8位的CPU28十进1010910八进078C十六进16C0x字8bitsizeof关键sizeofsize_t类sizeof由于sizeof返回的是一个大于等于0的整数,所以如果用int来表示sizeof的返回值就不合适,size_t一般就是一个无符号的整数.十进制,二进制,八进制,十六进int类int常量,变64位操作系统下,int4inta;//4a10;//4高地址放,底地址放低位---小端对齐高地址放低位,底地址放—大端对unixCPU但对于x86构架CPU,还有ARM,是小端对齐printfintinta0x100;//printf(“%d”,a);%d的意思是按照10进制打印一个整%X,输出十六进制的时候是用大写的ABCDEF还是小写的printf输出八进制和十short,long,longlong,unsigned32short2longint4longlong8个字节64位操作系统下int,4个字节long648unsignedint//无符号整数unsignedlong//无符号的长整数unsignedshort//无符号短整数整数溢intI=shorta=当一个int赋值给short,会将抛弃char类charchar是字符型,代表一个字节的内char在内存当中,有符号最大unsignedcharchar的本质就是一个字节,一个printf不可打char转义\a,警\b\n\r\t\\斜\’单引\”双引\?问charunsignedchar取值范围为-128unsignedchar0-float,double,longdouble类浮点常量floatf=2.5;doublef1=3.printf输出浮点类型限const限定一个变量的值不可以改volatile类型变量,每一步都需要从内存当中字符串格式化输出和输字符串在计算机内部的方char空间,以’\0’结尾0char的内存printf函数,putchar函dShortUnsignedshortounsigned8uunsigned10x/unsigned16进制整数,x对应的是ffloate/c字符型。可以把输入的数字按照ASCII码相应s/char*/wchar_tpvoid16%%printfld,u,x,o-m(代表一个整数0将输出的前面补上0 n位不够以空格填充printfputcharscanfgetchar函运算符表达式和语基本运5.1.1数据对象:泛指数据在内存的区域.3*/%5.1.7inta=10;a=a+a+=5.1.8-a=a–5;a-=a=a*5;a*=逗号运算intI=6+5,3+运算符优先1,-((,{}(,.,-2-(-!(type(3*,/,45<<6<><=7==8&9^|?=,*=,%=,+=,-,(逗号运算符复合语{}代码类型转doubled=intad;//隐式转inta1=3;inta2=doublemid(double)a1double)a2;//显示的强转printf("mid=%f\n",mid);条件分支语关系运C00代表真..46.1.5一个=C语言里面是赋值的,不是比较的,但是很多初学者爱犯一个严重的错误,就6.1.6关系运算符优先逻辑运!if分支if语句,只可能执行一路,不可能同时执行,也不可能都没有被执ifelseifelseifelse是和最近的一条if语句配对switchswitch是为多重选择准备的,遇到break语句,switch就终端执条件运算符intinti=-intintx=(i<0)?-i:? goto语句与标循环语while(条件,如果条件为真,那么循环就执行,否则循环退continue意思是跳过下面语句,继续执行循break中断循环dowhile条件dowhile循环嵌整数在计算机内部的方原将最做为符号位(0代表正,1代表负,其余各位代表数值本身的绝对-7的原码是-0反补7和-7相加,还需要判断符号位。负数:最为1,其余各位原码取反,最后对整个数+-7-7(原码(反码-0补码符号位不动,其他位求反,最后整个数1用补码进行运算,减法可以通过加法实7-7的补码和-6的补码相加:+1=-7+6=--76是-1+=数内存连续,并且是同一种数据类型的变量,C语言的数组小标好是从0开始的,到n-一维数组定义与[数组元素的个数数组在内存的方一维数组初始intarray[10]{0};//0intarray[10]={0,1,2,3,4,5,6,7,8,9}测量地球距离的说测量木星距离的说二维数组定义与intarray[3][4];//12个元素的二维数二维数组初始intinta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}字符串与字符数字符数组定charC语言字符串其实就是一个最后一个元素为’\0’char数组字符数组初始charbuf[]=“o字符数组使随机数产生函数rand#include#include<time.h>intt=(int)time(NULL);for(inti=0;i<10;{printf("%d\n",}scanf输入字charbuf[100]={0};scanf(“%s”,buf);scanf("请输入i的值%d",字符串的结束标字符串处理函gets没有解决缓冲区溢出的问题fgets函gets函数查预留缓冲区是否能够容纳用户实际输入的数据多出来的字符会导致内存溢出,fgets由于fgets函数是为文件设计的,所以键盘时没有gets那么方chars[100]={0};fgets(s,chars[100]={0};fgets(s,sizeof(s),stdin);puts函chars[]=chars[]=ofputs函chars[]=chars[]=ofputs(s,strlenstrlen返回字符串的长度,但是不包含字符串结尾的charsizeof(buf);//返回的是数组buf一共占据了多少字节的内存空间strcatcharstr1[100];charstr1一定要有足够的空间来放str2,不然会内存溢出strncat,字符串有限追strncat(str1,str2,sizeof(str1)–strlen(str1)-strcmpstrcmp(a,str”);//strncmp,字符串有限比strcpystrncpy字符串有限拷sprintf,格式化字符printf是向屏幕输出一个字符sprintf是向char数组输出一个字符串,其他行为和printf一模一sprintf也存在缓冲区溢出的问strchrstrstr查找子strtok分割字符charcharbuf[]="abc@defg@igk";char*p=strtok(buf,"@");;while(p){printf("%s\n",p=strtok(NULL,}atoi转化atof转化atol转化函函数的原型和调在使用函数前必须定义或者函doubledoublecircle(doubler);intmain(){doublelength=circle(10);printf("length=%f\n",length);return0;}doublecircle(double{return2*3.14*}函数的形参与实函数的返回类型returnvoid函数return语句中的返回值数据类型应该与函数定义时相同如果函数中没有return语句,那么函数将返回一个不确定的值main函数exit函mainreturnreturn代表子函数的voidrecurse(intvoidrecurse(int{if(i>if(i>{recurse(i-}printf("i=%d\n",}int{return0;}递归的过程voidvoid {printf("in%d,location%p\n",n,&n);if(n<4)up_down((n+printf("out%d,location%p\n",n,}int{return0;}有n个人排成一队,问第n个人多少岁,他回答比前面一个2岁,再问前面一个人多少岁,他回答比前面一个2岁,一直问到最后问第一个人,他回答10岁intintage(int{intif(n==1)i=10;i=age(n-1)+2;returni;}将10进制数转化为二进制数的例2342*1023*1014*100次方。10。number%2得到二进制形式的最后一位,如果要将一个完整的整数转化为二number2的值,然后在递归调用语句之后进行输出,这样计算201。22voidvoidto_binary(unsignedint{unsignedinti=n%2;if(n>=2)to_binary(n/2);printf("%c",i+0x30);}那契数列例0,1,1,2,3,5,8,13,21,3455,89,14400112intintfib(int{if(n==0)return0;if(n==1)return1;if(n>returnfib(n-1)+fib(n-}汉诺塔的例1,2,3。1411n-1322133n-1213voidvoidhanoi(intn,intone,inttwo,int{if(n==printf("%d->%d\n",one,three);{hanoi(n-1,one,three,two);printf("%d->%d\n",one,three);hanoi(n-1,two,one,three);}}递归的优递归的缺一个有缺陷的递归会很快耗尽计算机的资源,递归的程序难以理解和多个源代码文件程序的编头文件的使main函数放在第一个文件中,而把自定义函数放在第二个文件中,那么就需要在第一个文件中函数原型。如果把函数原型包含在一个头文件里,那么就不必每次使用函数的时候都其原型了。把函数放入头文件是很好的习惯。#include与#define的意#ifndef与函数的二进制封exedll的说动态库中代码与位置无关的说明linuxso文件的方1首先gcc编译的时候要加-fPIC选项,-fPICgcc生成一个与位置无关的代2gcc的时候要加-shared选项,意思是生成一个so共享库linuxgcc的时候需要加-L.代表从当前 下找相关的so文件,-l文件名(但不包括文件名开头的lib和扩展名so)例如编译一个main.o文件,要用到当 下的liba.sogcc–omain.out–L.–la配置profile文件可以在当 下查找so文linux不在当前 下找so库文件1vi.bash_profileexportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:.5.作业描intsum1(intn);//n=10 intsum2(intn);//n=10 0n范围内所有素数的和指指指针的概指针变量的int*p;//*p;//代表指针所指内存的实际数intint*p=野指&取地址运无类型指void*为其他类型指针,也可以用(void*)voidvoidCvoid*指针的兼容*指针与数组inta[10];int*p=a;C语言当中数组的名称代表数组的首地址,如果取数组名称的地址,C语言认为就是取通过指针使用数组元通过指针计算,不是把指针当做一个整数,计算结果,而是指针在内存当中移p1代表&a[1],p[1]a[5]p+5代表&a[5]C指针数int数组指int指向指针的指针(二级指针inti=10;int*p1=&i;int**p2=&p1;printf("%d\n",**p2);3指针变量做为函数的参一维数组名作为函数参当数组名作为函数参数时,Cintfunc(int二维数组名作为函数参intfunc(int指向二维数intaa[0],*(a+0),0行,0a+1a[1],*(a+1行,0a[1]+2,*(a+1)+2,1行,2*(a[1]+2),*(*(a+1)+2),1行,2指向常量的指针与指针常constchar*p;//char*constp;//const关键字保护数组内const参数func(constint指针做为函数的返回char*func();//char*指向函数的函数指针的定义方式:int*p)(int);//intfunc(intn)3int*P)()voidvoid{printf("抽烟printf("喝酒 }void{printf("化妆printf("printf("逛街printf("网购}int{inti=0;scanf("%d",&i);if(i==0)p=man;p=woman;return}intmax(inta,int{if(a>returna;returnintmax(inta,int{if(a>returna;return}intadd(inta,int{returna+}voidfunc(int(*p)(int,int),inta,int{intres=p(a,b);printf("%d\n",res);}int{{ i=0;scanf("%d",&i);if(i==0)func(max,10,20);func(add,10,return}赋值:int*p=&a;求值:intIint**pp将一个整数加(减)给指针:p+3;p–增加(减少)p++,p求差值,p1–p2,通常用于同一个数组内求两个元间的距离比较p1==p2,通常用来比较两个指针是否指向同一个位置。指针小 intintIntintIntintIntintIntint*IntIntint字符指针与字符指针和字符chars[]=chars[]=char*p=p[0]=o通过指针字符串数函数的参数为char指针数组做为main函数的形intmain(intargc,char//不可以使用任何C语言库函数,只可以自己写函数实现int到字符串voiditoa(inti,char{}内存管作用Cauto自动变一般情况下代码块内部定义的变量都是自动变量。当然也可以显示的使用aotu关键register通常变量在内存当中,如果能把变量放到CPU的寄存器里面,代码执行效率会更registerint代码块作用域的静态变能被这个代码块内部。代码块作用域外的静态代码块之外的静态变量在程序执行期间一直存在,但只能被定义这个变量的文件全局变全局变量的方式和静态变量相同,但可以被多个文件外部变量与extern关键externint全局函数和在C语言中函数默认都是全局的,使用关键字static可以将函数为静内存四代码静态所有的全局变量以及程序中的静态变量都到静态区,比较如下两段代码的区inta=inta=staticintb=0;intmain(){printf("%p,%p\n",&a,&b);return0;}inta=0;int{staticintb=0;printf("%p,%p\n",&a,&b);return0;}栈stack是一种先进后出的内存结构,所有的自动变量,函数的形参都是由编译器自动放堆heap和栈一样,也是一种在程序运行过程中可以随时修改的内存区域,但没有栈那样堆的分配和释callocint*p=(int*)calloc(100,sizeof(int));//int*p=(int*)calloc(100,sizeof(int));//100C结构体,联合体,枚举与结构定义结构体struct和初始structstruct{charname[100];intage;structmanm={"tom",12structmanm={.name="tom",.age=12结构体.结构体的内存对齐模structstructchara;intb;指定结构体元素的位字structstructchara2;//指定元素为2位长,不是2结构数structmanm[10]={{"tom",12},{"marry",10},{"jack",9}structmanm[10]={{"tom",12},{"marry",10},{"jack",9}嵌套结structstructcharfirst[100];charlast[100];structstructnamesname;intage;structmanm={{"wang","wu"},20结构体的赋structnamea=指向结构体的指指向结构体数组的指结构中的数组成员和指structstruct{char*name;intage;struct{charname[100];intage;在堆中创建structstruct{charchar*name;intage;structman*s=malloc(sizeof(structman)*2);s[0].name=malloc(10*sizeof(char));s[1].name=malloc(10*sizeof(char));结构,还是指向结构的远指针与近联合联合union是一个能在同一个空间不同类型数据的类型。unionvariant{intivalue;charcvalue;doubleunionvariant{intivalue;charcvalue;doubledvalue;int{unionvariantvar;var.cvalue=12;printf("%d\n",var.ivalue);printf("%p,%p,%p\n",&(var.cvalue),&(var.ivalue),return}枚举类枚举定实际上,enumint类型的。int型的常量。enumenumspectrum{red,yellow,green,blue,white,black};enumspectrumcolor;color=if(color!=默认0,1,2enumenumspectrum{red,yellow,green,blue,white,black};printf("%d,%d\n",red,black);enumenumspectrum{red=10,yellow=20,green,blue,white,black};printf("%d,%d\n",red,black);typedef是一种高级数据特性,它能使某一类型创建自己的名typedefunsignedchartypedefunsignedchar1与#define不同,typedef仅限于数据类型,而不是能是表达式或具体的2typedef是编译器处理的,而不是预编译指3typedef比#definetypedefBYTEunsignedchartypedef可以typedef定义函数指constconstchar*(*p[3])(constchar*,constcharconstchar*func(constchar*(*s)(constchar*,constcharconstchar*src,constchartypedefconstchar*(*SUBSTR)(constchar*,constcharconstchar*getsubstr(constchar*src,constchar{returnstrstr(src,}在程序当中如果是定义一个可读的常量,适合用typedef吧.文件操rr+r+写文件时候,从文件开始位置写入rb+读写打开一个二进制文件,允许读写数据,文件必须存在。rw+w打开只写文件,若文件存在则文件长度清为0,即该文件内容会。若文件不存在则w+打开可读写文件,若文件存在则文件长度清为零,即该文件内容会。若文件不存a以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的(EOF符保留),如果文件不存在,a的行w是一样的a+以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。(原来的EOF符不保留)“b”只对windows有效,对于unix来讲是无效二进制和文本模式的区在windows系统中,文本模式下,文件以"\r\n"代表换行。若以文本模式打开文件,并用fputs等函数写入换行符"\n""\n"前面加上"\r""\r\n"。Unix/Linux系统中文本模式下,文件以"\n"Linux系统中在文本模GBKutf83个字节,但如果英fclose关闭fo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论