2022年C语言读书报告 .pdf

上传人:Che****ry 文档编号:27251032 上传时间:2022-07-23 格式:PDF 页数:14 大小:159.06KB
返回 下载 相关 举报
2022年C语言读书报告 .pdf_第1页
第1页 / 共14页
2022年C语言读书报告 .pdf_第2页
第2页 / 共14页
点击查看更多>>
资源描述

《2022年C语言读书报告 .pdf》由会员分享,可在线阅读,更多相关《2022年C语言读书报告 .pdf(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、1C语言读书报告C语言在本科一年级时就已经学过,当时学习后主要是以编写简单的循环和判断等结构化程序为目标,用C 来解决一个数学上的一个简单问题。在后面C的精华,指针,只是稍作了解, 更不用说复杂的文件和结构体等操作。这次重读, 也是以指针、 文件、内存、 结构,这四个方面为主。使用的是CPRIMERPLUS 。C语言是面向过程的编程语言,有以下几个优点:1、设计特性它的设计使得用户可以自然地采用自顶向下的规划、结构化的编程,以及模块化设计。这种做法使得编写出的程序更加可靠、更易懂。2、高效性3、可移植性各种操作系统都有其自己的C编译器,这使得C的移植比其他语言更加容易。4、强大的功能和灵活性其

2、他很多语言编译器,如FORTRAN 、Perl、Python 等都是用C来编写的。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 14 页 - - - - - - - - - 2目录C语言读书报告 .1一 数组与指针 .31.1 数组 . 31.2 指针 . 31.3 指针与一维数组.31.4 指针与多维数组.41.5 指针数组与数组指针. 41.6 指针变量和指针常量. 4二 字符与字符串 .52.1 单字符的输入 /输出 . 52.2 字符串的定义 .62.3 字符串

3、输入scanf() gets() fgets(). 62.4 字符串输出puts()fputs()printf () .62.5 自定义输出函数.72.6 sprintf ()函数 . 72.7 把字符串转换为数字. 8三 文件操作 . 93.1 什么是文件 .93.2 文件的打开关闭.93.3 文件 IO. 103.4 格式化读写函数fprintf ()与 fscanf() . 113.5 字符串读写函数fgets()和 fputs() .113.6 数据块读写函数fwrite ()与 fread() .113.7 随机存取 .12四 内存管理 .134.1 内存分配方式.134.2 分配内

4、存: malloc()和 free() . 13名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 14 页 - - - - - - - - - 3一 数组与指针1.1 数组一维数组像一个指定大小的向量,说像, 是因为放在数组中的数据按顺序排成一排,每一个下标对应一个数值(整形、浮点型、字符型),不像的地方在于向量大小可以伸缩,C+中的 vector 就是这样一个可以随意伸缩的向量。关于一个初始化的问题。数组可以在声明时进行初始化,初始化后大小固定,可以在中指定数组大小, 在

5、声明时初始化,如果初始化元素没有达到指定的大小,后面不足的默认为 0。如果声明时不指定大小,即中的值缺省,则必须在声明时进行初始化,编译器会根据列表中的数值数目来确定数组大小。赋值问题 。如果要对数组中的所以数进行赋值或打印,那么只能采用循环赋值的方式,通常采用以下方式Int day=31,32,33,34,23,30,32,12,14;Int index;For(index =0;indexsizeof (day)/sizeof(day0;index+)Printf(“ num%d:%d” ,dayindex);控制语句使用sizeof,让计算机来计算数组大小,避免出错。二维数组 。int

6、arrayROWVOL,内部数据排放可以理解成一个矩阵,用某行某列指定数组中的一个元素。也可以将其理解成多个一维数组的排放。与一维数组类似,只是初始化时每一行元素用圈起,当然, 中的元素也可以小于列大小,这样其他的就默认为0,二维数组的赋值取值往往使用两个for 循环。1.2 指针& 地址运算符通过这个运算符得到的是变量在程序虚拟空间的地址后跟一个变量名,&给出该变量的地址* 间接运算符(或叫取值运算符)用来获取地址中存放的数值当后面跟一个指针名或地址时,* 给出存储在被指向地址中的数值Int a = 3;Int *b = &a;上例中 a 是一个变量,&a 取得 a 的地址,在这个地址里放着

7、a 的值,将这个地址赋给指针 b,这时指针b 就指向 a 的地址,上面是指针的初始化。那么什么是指针呢?指针是一个其数值为地址的变量。1.3 指针与一维数组数组名就是一个地址,这个地址存放的是数组的第一个元素,如下Int arr5 = 1,2,3,4,5;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 14 页 - - - - - - - - - 4Arr = arr0;Int *ptr = arr;1.4 指针与多维数组Int zippo42;Zippo = zippo

8、0 = zippo00数组名 Zippo 同时也是数组首地址,其中zippo0 表示包含两个int 的数组,所以zippo也是包含两个int 的数组的地址Zippo第 1 个大小为2 个 int 的元素的地址Zippo+2第 3 个大小为2 个 int 的元素的地址*(zippo+2)第 3 个元素,即包含两个int 的数组,因此也是其第1 个元素的地址*(zippo+2)+1包含 2 个 int 值的数组的第2 个元素的地址*(* (zippo+2) +1)数组第 3 行第 2 个 int 的值, zippo211.5 指针数组与数组指针指针数组即用于存储指针的数组,也就是数组元素都是指针例

9、如int *a4 ;因为 的优先级高于*,所以 a 先与右边的 4结合成一个数组,然后再与取值运算符* 结合,形成一个指针,更加通俗的是下面的定义形式Typedef int* pInt;pInt a4;数组指针即指向数组的指针例如int ( *b)4;具体可以参考链接中的博文:http:/ 指针变量和指针常量两者的区别类似于常量与变量的区别,变量即其值可变,常量即值不可变。Int *ptr ;这里 ptr 是一个 指向整型的指针,是一个变量。Int const *ptr ;由于有const 修饰指针,故它是一个指向整型常量的指针,它也是一个变量,但是只能修改指针的值,不能改变它指向的值Int

10、* const ptr;这里 ptr 是一个 指向整形的指针常量;它是一个常量,所以指针无法修改,但是可以修改其指向的整型值Int const * const ptr ;这里 ptr 是一个指向整形常量的指针常量,指针和其指向的值都无法修改。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 14 页 - - - - - - - - - 5二 字符与字符串字符char 定义的变量,如char ch=A ;字符串以空字符( 0)结尾的数组2.1 单字符的输入 / 输出Getch

11、ar() 单字符输入函数,表示从输入设备读取一个字符Putchar() 单字符输出函数,表示向输出流输出一个字符例 char ch;While( (ch = getchar() ) != #)Putchar( ch) ;上面几句是从输入设备读取字符到ch,然后输出。在不同的系统上可能会有不同的输入输出结果,以下是两种可能的结果,表示了不同的系统。输入: hello, world!输出: hello, world!另一运行结果可能是:hhllllo,wwoorrlldd!第一种是输入完之后回车,输出前面输入的文本。后一种则是输入一个马上输出一个。前者的运行在带缓冲区的系统,后者则是非缓冲输入。缓

12、冲区的优点是:若干字符作为一个块传输比逐个发送这些字符耗时更少,其次,如果输入有误可以使用键盘修改。非缓冲输入主要用于一些交互性程序,如游戏中的一些操作。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 14 页 - - - - - - - - - 62.2 字符串的定义Charstrnum = “;Char*str =”“;Char*strnum = “ , ” “ , , ”“ ; 定义多个字符串2.3 字符串输入scanf() gets() fgets()Gets()

13、括号内放一个地址它从系统的标准输入设备获得一个字符串,读字符串直至遇到n ,读入字符串后会自动在末尾添加 0 ,表示结尾,所以字符串存放的地址大小要比真正输入多一个。注意,当我们输入完后,输入回车结束输入,gets()自动将换行符舍弃。fgets()它的使用格式如下fgets (目标地址,最大读入字符数,输入流stdin)例 fgets(name,MAX,stdin);从键盘输入获取名字,最多输入MAX 个FILE*fpFgets(str,MAX,fp);从文件fp 中读取最多MAX-1 个字符,放入str。因为 gets()读取字符串时不检查预留存储区是否能够容纳实际的输入,多出来的字符简单

14、的溢出到相邻的内存区,fgets()则改进了这个问题。两者有三个区别:1fget()需要第二个参数说明最大读入字符数,如果参数值为n,则 fgets()就会读取最多 n-1 个字符,或者读完一行为止,二者中最先满足的那个来结束输入。2如果 fget()读到换行符,就会把它存到字符串里,而不是像gets()一样舍弃它。3第三个参数指定读哪一个文件,从键盘读数据时,可以使用stdin 作为该参数。Scanf()以%s格式读取一个字符串与 gets()的最大区别在于如何决定字符串何时结束Gets()遇换行符结束Scanf()使用两者方式,一是换行符,二是指定字段宽度,%10s,那么 scanf()读

15、入10 个字符或遇到第一个空白字符结束。2.4 字符串输出puts()fputs ()printf ()Puts()括号内给出字符串参数的地址,或者双引号内的字符串。注意, puts()输出字符串时自动在其最后添加换行符Fpus()它是 puts()的面向文件版本,两者的区别如下:1fputs()需要第二个参数说明要写的文件,可以使用stdout 作为参数进行输出显示2与 puts()不同, fputs()并不为输出自动添加换行符。Fputs(line,stdoout/fp ) ;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - -

16、名师精心整理 - - - - - - - 第 6 页,共 14 页 - - - - - - - - - 7printf ()printf ( “%sn” ,string) ;2.5 自定义输出函数Void put1 (const char * string)While(*string != 0 )Putchar(*string+) ;/ 不添加换行符打印一个字符串2.6 sprintf ()函数函数的作用和printf ()一样,但是它写到字符串里而不是写到输出显示。使用格式Sprintf(目标字符串地址,与printf ()参数一样的转换说明符(如%s) ,项目列表 )例 sprintf(f

17、ormal,”%s,%-19s,$%6.2fn ”,last,first,prize);2.7 字符串函数Strlen() 、strcat() 、 strncat() 、strcmp() 、strncmp () 、 strcpy() 、strncpy()Strlen()得到字符串的长度,括号内放地址Strcat()接受两个字符串参数,它将第二个字符串的一份拷贝添加到第一个字符串的结尾,实际上,第二个字符串的第一个字符会被第一个字符串替代。Strncat()Strncat(第一个字符串,第二个字符串,Max) ,函数把第二个字符串拷贝到第一个字符串直到 Max 个字符或空字符。Strcmp()比

18、较两个字符串相等返回 0第一个字符串小于第二个字符串返回-1第一个字符串大于第二个字符串返回1如果第一个字符串的个数大于第二个字符串返回1Strncmp()Strcmp()的变种, 前者接受第三个参数指定需要比较的个数,例如strncmp( “Hello” ,“Hell” ,4) ;Strcpy()接受两个字符串的地址作为参数,功能是将第二个地址存放的字符串复制到第一个地址中。高级属性: strcpy()是 char*类型,它返回第一个参数的值,即一个字符的地址名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - -

19、 - - - - - 第 7 页,共 14 页 - - - - - - - - - 8Strncpy()与 strcpy()类似,增加第三个参数指定最大复制数Strncpy(target,source,n)2.7 把字符串转换为数字Atoi()以字符串为参数,返回相应的整数值。atof()返回浮点值atol()返回long 型的值strtol ()其原型如下Longstrtol (const char *nptr ,char *endptr ,int base) ;Nptr 是一个指向您希望转换的字符串的指针,endptr 是指向标志输入数字的结束字符的指针地址, base 是数字的基数。St

20、rtol(number,&end,10);还有 strtoul ()转换为unsigned long 型, strtod ()转换为double 型名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 14 页 - - - - - - - - - 9三 文件操作3.1 什么是文件1)从用户角度看,文件可以分为普通文件和设备文件两种普通文件是驻留在硬盘或其他外部介质上的有序数据集,可以是源文件、 目标文件、 可执行文件;也可以是一组待处理的原始数据,或者一组输出结果。对于源文件、

21、目标文件、可执行程序可以称作程序文件,对输入输出数据可称作数据文件。设备文件是指与主机相联的各种外部设备,如显示器、 打印机、 键盘等。在操作系统中,把外部设备也看作是一个文件来进行管理,把它们的输入、 输出等同于对磁盘文件的读和写。通常 把显示器定义为标准输出文件, 一般情况下在屏幕上显示有关信息就是向标准输出文件输出。如前面经常使用的printf 、putchar 函数就是这类输出。键盘通常被指定标准的输入文件,从键盘上输入就意味着从标准输入文件上输入数据。scanf、getchar 函数就属于这类输入。2) 从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种。ASCII文

22、件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的 ASCII码。例如,数 5678 的存储形式为:共占用 4 个字节。ASCII码文件可在屏幕上按字符显示,例如源程序文件就是ASCII文件,用 DOS命令 TYPE可显示文件的内容。由于是按字符显示,因此能读懂文件内容。二进制文件是按二进制的编码方式来存放文件的。例如,数 5678 的存储形式为:0001011000101110只占二个字节。二进制文件虽然也可在屏幕上显示,但其内容无法读懂。C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。输入输出字符流的开始和结束只由程序控制而不受物理符号(如回

23、车符)的控制。因此也把这种文件称作“ 流式文件 ” 。3.2 文件的打开关闭Fopen(文件名,打开模式)这里文件名更具体点应该是包含该文件名的字符串地址,第二个参数也是一个字符串。例FILE*fp ;Fp= Fopen( “text.txt”,” r ”)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 14 页 - - - - - - - - - 10这里以读的方式打开text.txt 文件, fopen 返回的文件指针赋给文件指针fp。文件打开模式如下表:“r“打开一

24、个文件,可以读取文件“w“打开一个文件,可以写入文件,先将文件的长度截为零。如果该文件不存在则创建“a“可以写入文件,向文件的尾部追加内容,如果该文件不存在则创建之“r+“可以进行更新,也可以读取和写入文件“w+“可以进行更新,如果该文件存在则先将它的长度截为零,如果不存在则创建之“a+“可以进行更新,向已有文件的尾部追加内容,如果该文件不存在则先创建之,可以读取整个文件,但写入时只能追加内容“ rb ” , ” wb” , ” ab ”,” ab+ ” , ” a+b ” , ” wb+”,“ w+b” , ” ab+ ” , ” a+b ”与前面的模式想似,只是使用二进制模式而非文本模式打

25、开文件FILE*fp;If(fp=fopen(“ text.txt” , ” r ”)=NULL)Printf(“ Cantopen file!” );Exit(1);Fclos(文件指针)通常如下使用If(fclose(fp) != 0)Printf(“ Errorin closing filen” );3.3 文件 IO3.1 getc()与 putc()类似于 putchar ()和 getchar() ,不同之处在于getc()和 putc()需要知道他们要使用的文件。功能: getc()从文件获取一个字符,并返回这个字符Putc(ch,fp)将字符ch 写入到文件指针指定的文件中常用

26、形式如下语句Int ch;FILE*fpin,*fpout;Fpin = fopen(“ in.txt” , ” r ” );Fpout =fopen(“ out.txt” , ” w” ):While(ch = getc(fpin) !=EOF)Putchar(ch);Putc(ch,fpout);名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 14 页 - - - - - - - - - 113.4 格式化读写函数fprintf ()与 fscanf()这两个函数的

27、工作方式与printf () 、scanf()类似,可以以指定格式输入输出文件内容,不同在于fprintf ()和 fscanf()有三个参数,第一个参数是文件指针指定要读写的文件。两者的调用格式为:fscanf(文件指针 ,格式字符串 ,输入表列 );fprintf( 文件指针 ,格式字符串 ,输出表列 );3.5 字符串读写函数fgets()和 fputs ()1)读字符串函数fgets()函数功能是从指定的文件中读一个字符串到字符数组中,函数调用形式如下:fgets(字符数组名 ,n,文件指针 );其中的 n 是一个正整数。表示从文件中读出的字符串不超过n-1 个字符。在读入的最后一个字

28、符后加上串结束标志0 。例如:fgets(str,n,fp);的意义是从fp 所指的文件中读出n-1 个字符送入字符数组str 中。对 fgets()函数作两点说明:在读出 n-1 个字符之前,如 遇到了换行符或 EOF ,则读出结束 。fgets函数也有返回值,其返回值是字符数组的首地址。2)写字符串函数fputs()fputs 函数的功能是向指定的文件写入一个字符串,其调用形式为:fputs( 字符串 ,文件指针 );其中字符串可以是字符串常量,也可以是字符数组名,或指针变量,例如:fputs(“ abcd “ ,fp);其意义是把字符串“abcd”写入 fp 所指的文件之中。3.6 数据

29、块读写函数fwrite ()与 fread ()C语言还提供了用于整块数据的读写函数。可用来读写一组数据,如一个数组元素,一个结构变量的值等。读数据块函数调用的一般形式为:fread(buffer,size,count,fp);写数据块函数调用的一般形式为:fwrite(buffer,size,count,fp);其中:buffer:是一个指针,在fread 函数中,它表示存放输入数据的首地址。在fwrite 函名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 14 页

30、- - - - - - - - - 12数中,它表示存放输出数据的首地址。size:表示数据块的字节数。count:表示要读写的数据块块数。fp:表示文件指针。例如:Fread(fa,4,5,fp) ;其意义是从fp 所指的文件中,每次读4 个字节送入实数组fa 中,连续读5 次,即读5个实数到 fa 中。3.7 随机存取Fseek() 、ftell () 、rewind()Rewind()功能是把文件内部的位置指针移到文件首Rewind(fp) ;Fseek()Fseek函数用来移动文件内部位置指针,其调用形式为:Fseek(文件指针,位移量,起始点);其中:“ 文件指针 ” 指向被移动的文

31、件。“ 位移量 ” 表示移动的字节数,要求位移量是long 型数据, 以便在文件长度大于64KB时不会出错。当用常量表示位移量时,要求加后缀“L”。“ 起始点 ” 表示从何处开始计算位移量,规定的起始点有三种:文件首,当前位置和文件尾其表示方法如下表:起始位置表示符号数字表示文件首SEEK_SET0当前位置SEEK_CUR1文件末尾SEEK_END2Ftell()函数为 long 类型,返回文件当前位置。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 14 页 - -

32、- - - - - - - 13四 内存管理4.1 内存分配方式内存分配方式有三种:(1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存的整个运行期间都存在。例如全局变量,static 变量。(2)在栈上分配。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些内存单元自动释放。栈内内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。(3)从堆上分配,亦称动态内存分配。程序在运行时用malloc 或 new(C+)申请任意多少的内存,程序员负责在何时用free 或 delete 释放内存。动态内存的生存期由程序员决定,使用灵活,但是问题也

33、多。4.2 分配内存: malloc ()和 free()Malloc 函数接受一个参数:所需内存字节数。返回该内存第一个字节的地址函数原型:Void * malloc(size_t size);名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 14 页 - - - - - - - - - 14考虑如下代码:Double *ptd ;Ptd = (double* )malloc(30*sizeof(double ) ) ;因为 malloc()返回类型是void* ,所以需要在前面加(double* )将其强制转换成对应的类型,这条语句分配了能存储30 个 double 类型值的数据块。Free()函数原型:Void free(void *memblock ) ;只要在括号内指定要释放的指针就可以正常释放内存了名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 14 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁