c primer学习笔记.docx

上传人:b****6 文档编号:4764754 上传时间:2022-12-08 格式:DOCX 页数:24 大小:31.70KB
下载 相关 举报
c primer学习笔记.docx_第1页
第1页 / 共24页
c primer学习笔记.docx_第2页
第2页 / 共24页
c primer学习笔记.docx_第3页
第3页 / 共24页
c primer学习笔记.docx_第4页
第4页 / 共24页
c primer学习笔记.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

c primer学习笔记.docx

《c primer学习笔记.docx》由会员分享,可在线阅读,更多相关《c primer学习笔记.docx(24页珍藏版)》请在冰豆网上搜索。

c primer学习笔记.docx

cprimer学习笔记

CPrimer

始于2014-11-12

文字颜色说明:

1)正文中的黑色粗字体表示首次看时,觉得比较重要的文字

2)正文中的红色表示,复习笔记后添加的知识点

ANSI(AmericanNationalStandardsInstitute)美国国家标准协会

第13章文件输入输出

13.1和文件进行通信

13.1.1文件是什么

C将文件看成是连续的字节序列,其中每一个字节都可以单独的读取;

13.1.2文本视图和二进制视图

二进制视图中,每一个字节都可以为程序所访问;

文本视图中,不同的操作环境(操作系统),程序所看到的内容和文件有可能不同(例如行尾的标志)

13.1.4标准文件

C语言提供3种标准文件。

标准输入、标准输出、标准错误输出;

✧标准输入:

getchar()、gets()、scanf()

✧标准输出:

putchar()、puts()、printf()

13.2标准I/O

13.2.1检查命令行参数

return0与exit(0)的区别:

✧最初调用的main函数中二者是一样的,main在一个递归程序中时,exit()会终止程序,而return只返回递归的前一级。

✧在main函数以外的函数中调用exit也会终止程序

13.2.2fopen()函数

fopen(参数1,参数2)

✧参数1:

是一个地址(指针或数组),数组中包含要打开的文件名

✧参数2:

是一个字符串,指定打开文件的模式。

有以下7大类模式

1)“r”打开一个文本文件,可以读取文件

2)“w”打开一个文本文件,可以写入文件,先将文件长度截为0。

若该文件不存在,先创建

3)“a”打开一个文本文件,向已有文件的尾部追加内容。

若不存在,先创建

4)“r+”打开一个文本文件,可以进行更新,也可以读取和写入

5)“w+”打开一个文本文件,可以进行更新(读取和写入)。

先将文件长度截为0,没有则先创建

6)“a+”打开一个文本文件,可以进行更新(读取和写入),读取整个文件,写入时只能向尾部追加内容

✧返回:

fopen函数返回一个文件指针fp,这个指针指向FILE(stdio.h中定义的一种派生类型),fp指向关于文件的信息的数据包。

如果不能打开文件则返回一个空指针NULL。

13.2.3getc()函数和putc()函数

getc()ch=getc(fp)表示从fp指定的文件中获得一个字符;

putc(参数1,参数2)

putc(ch,fpout)表示将字符ch写入到FILE指针fpout指定的文件中

13.2.42文件结尾

从文件中读取数据的程序需要在到大文件的结尾时停止。

到达文件结尾时,getc()函数会返回一个特殊值EOF

13.2.5fclose()函数

Fclose(fp)关闭由指针fp指定的文件,同时根据需要刷新缓冲区。

13.2.6标准文件指针

包含3个标准文件指针:

stdin(标准输入)、stdout(标准输出)、stderr(标准错误)

13.3一个简单的文件压缩程序

13.4文件I/O

每个I/O函数都存在一个相似的文件I/O函数。

文件I/O函数需要使用一个FILE指针来为这些函数指定要操作的文件。

13.4.1fprintf()和fscanf()函数

fprintf()和fscanf()

✧fprintf/fscanf(参数1,参数2,参数3)

参数1为FILE指针;例如fprintf(fp,“%s”,words)其中fp是FILE指针,words是数组名称;

rewind(参数1)使程序回到文件开始处,参数1必须是一个文件指针;

13.4.2fgets()和fputs()函数

fgets(参数1,参数2,参数3)fgets(buf,max,fp)

✧参数1:

一个地址,用于存储输入值的地址

✧参数2:

一个整数,输入字符串的最大长度

✧参数3:

一个文件指针,这个指针指向要读取的文件

✧返回值:

返回传递给它的地址值,当遇到EOF时,返回NULL

«fgets()函数读取到它遇到的第1个换行字符的后面,或者读取比字符串的最大长度少一个的字符,或者读取到文件结尾。

然后fgets()向末尾添加一个空字符以构成一个字符串。

如果fgets在达到字符最大数目之前读完一整行,它将在字符串的空字符前添加一个换行符以表示一行结束。

Fputs(参数1,参数2)

«把字符串地址指针所指的字符串写入指定的文件。

(与fgets相比,没有写入的长度,因为字符串包含结束符)

✧参数1:

一个地址,是要写入到文件的字符串的地址

✧参数2:

一个文件指针,指向要写入字符串的文件

fgets保留了换行符,fputs不会添加换行符;

13.5随机存取

13.5.1fseek()和ftell()文件的定位函数

fseek(参数1,参数2,参数3)

✧参数1:

一个文件指针,指向被搜索的文件

✧参数2:

一个long类型的值。

表示从起始点开始的偏移量(偏移的字节数),正表示前移,负表示后移,0表示保持不动

✧参数3:

模式,决定偏移量的起始点,一般分为SEEK_SET、SEEK_CUR、SEEK_END

✧返回值:

正常则返回0,不正常则返回-1

ftell(参数1)ftell函数为long型函数,返回文件的当前位置(1个long型数据)。

通过返回距离文件起始处的字节数目来确定文件的位置。

13.5.4fgetpos()和fsetpos()

处理较大文件的定位函数。

13.6标准I/O内幕

执行一次fopen函数:

✧打开一个文件

✧建立一个(读写模式下两个)缓冲区

✧创建一个数据结构(包含文件和缓冲区相关数据),包括以下内容

•错误指示器

•文件结尾指示器

•指向缓冲区起始处的指针

•文件标示符

•计数器:

记录实际复制到缓冲区中的字节数

✧返回一个指向该结构的指针

13.7其他标准I/O函数

13.7.4二进制I/O:

fread()和fwrite()

数据用二进制形式存入文件,没有数字形式到字符形式的转换。

存入的数据更精确。

13.8知识总结

比较常用的共12个

1)fopen(参数1,参数2)文件地址,模式

2)fclose(参数1)文件指针

3)getc(参数1)文件指针

4)putc(参数1,参数2)写入文件的字符,文件指针

5)fgets(参数1,参数2,参数3)存入字符串的地址,字符长度,文件指针

6)fputs(参数1)文件指针

7)fprintf(参数1,参数2,参数3)文件指针,输出格式,字符串地址

8)fscanf(参数1,参数2,参数3)文件指针,输入格式,字符串地址

9)fseek(参数1,参数2,参数3)文件指针,偏移量,起始点模式

10)ftell(参数1)文件指针

11)fread(参数1,参数2,参数3)

12)fwrite(参数1,参数2,参数3)

第14章结构和其他数据格式

14.1实例问题:

创建图书目录

P379

14.2建立结构声明

Structbook

{

chartitle[41];

charauthor[31];

floatvalue;

};

structbooklibrary;把library定义为一个book结构设计的结构变量;

其中struct是关键字,表示接下来是一个结构;

Book:

是一个可选的标记

花括号内是结构成员列表;

14.3定义结构变量

结构有两个意思:

一是结构设计,一是结构变量

✧结构设计:

告诉编译器如何表示数据,但并没让计算机为数据分配空间

✧结构变量:

编译器使用book模板为该变量分配空间;

声明结构和定义结构变量的过程可以合并,如下:

Struct

{

chartitle[41];

charauthor[31];

floatvalue;

}library;

但是如果要多次使用一个结构模板,就必须使用标记;

14.3.1初始化结构

使用一个用花括号括起来、逗号分隔的初始化项目列表进行初始化。

如下

Structbooklibrary

{

“CPrimer”,

“StephenPrata”,

60.00

};

14.3.2访问结构成员

访问结构的成员:

用结构成员运算符点(.)例

gets(library.title)

14.3.3结构的指定初始化项目

指定初始化:

用点运算符和成员名来表示具体的元素;

例:

structbookgift={.value=25.99,

.author=“JamesBroadfool”,

.title=“RuefortheToad”};

1)可以按任何顺序指定初始化

2)只初始化某个成员

3)对特定的成员,最后一次赋值是它实际的值

14.4结构数组

14.4.1声明结构数组

Structbooklibrary[10];

Library本身不是结构名,它是元素类型为structbook结构的数组名。

14.4.2表示结构数组的成员

library[1].value

library[2].title[5]第2个结构的title成员的第6个字符

14.5嵌套结构

结构的某一个或多个成员也是结构。

访问嵌套结构的成员的方法:

应用两次点运算符。

#include

#defineLEN20

constchar*msg[5]=//定义字符常量数组

{

"Thankyouforthewonderfulevening,",

"Youcertainlyprovethata",

"isaspecailkindofguy.Wemustgettogether",

"overadelicious",

"andhaveafewlaughs"

};

structnames

{

charfirst[LEN];

charlast[LEN];

};

structguy

{

structnameshandle;

charfavfood[LEN];

charjob[LEN];

floatincome;

};

intmain(void)

{

structguyfellow={//初始化结构

{"Even","Villard"},

"grilledsalmon",

"personalitycoach",

58112.00

};

printf("Dear%s,\n\n",fellow.handle.first);

printf("%s%s\n",msg[0],fellow.handle.first);//访问嵌套结构的成员

printf("%s%s\n",msg[1],fellow.job);

printf("%s\n",msg[2]);

printf("%s%s%s\n",msg[3],fellow.favfood,msg[4]);

printf("\n%40s%s\n","","Seeyousoon,");

printf("%40s%s\n","","Shalala");

return0;

}

14.6指向结构的指针

14.6.1声明和初始化结构指针

声明:

structguy*him;意味着指针him现在可以指向任何现有的guy类型的结构。

初始化:

him=&fellow[0];

14.6.2使用指针访问成员

初始化后的him,有两种方式访问指针成员

✧him->income;

✧(*him).income二者完全相同

14.7向函数传递结构信息

函数与结构的传递包括3种方式:

传递结构成员、传递结构地址、传递结构;

14.7.1向函数传递结构成员

14.7.2向函数传递结构地址

#include

#defineFUNLEN50

structfunds

{

charbank[FUNLEN];

doublebankfund;

charsave[FUNLEN];

doublesavefund;

};

doublesum(conststructfunds*);//声明函数,其中参数为指向结构的指针

intmain(void)

{

structfundsstan={

"Garlic-MelonBank",

3024.72,

"Lucky'sSavingsandLoan",

9237.11

};

printf("Stanhasatotalof$%.2f.\n",sum(&stan));//结构的地址必须用&

return0;

}

doublesum(conststructfunds*money)

{

return(money->bankfund+money->savefund);//通过指针直接访问原结构stan

}

14.7.3向函数传递结构

#include

#defineFUNLEN50

structfunds

{

charbank[FUNLEN];

doublebankfund;

charsave[FUNLEN];

doublesavefund;

};

doublesum(structfundsmoolah);//声明函数,参数为结构

intmain(void)

{

structfundsstan={

"Garlic-MelonBank",

3024.72,

"Lucky'sSavingsandLoan",

9237.11

};

printf("Stanhasatotalof$%.2f.\n",sum(stan));//将结构传递给函数

return0;

}

doublesum(structfundsmoolah)

{

return(moolah.bankfund+moolah.savefund);//会创建一个和stan一样的结构

}

14.7.4结构的一些特性

1)结构的成员、结构的地址、结构可作为函数的参数向函数传递信息

2)赋值:

两个结构类型相同,可将一个结构赋值给另外一个结构

3)把一个结构(已经初始化的)初始化另外一个结构

4)结构可以作为函数的返回值

结构指针作为参数的例子:

//要求输入名和姓,然后得到姓名中的字母总数

#include

#include

structnamect{

charfname[20];

charlname[20];

intletters;

};

voidgetinfo(structnamect*);

voidmakeinfo(structnamect*);

voidshowinfo(conststructnamect*);

intmain(void)

{

structnamectperson;

getinfo(&person);//传递的是结构的地址

makeinfo(&person);

showinfo(&person);

return0;

}

voidgetinfo(structnamect*pst)

{

printf("Pleaseenteryourfirstname.\n");

gets(pst->fname);//实际操作的还是那一个结构

printf("Pleaseenteryourlastname.\n");

gets(pst->lname);

}

voidmakeinfo(structnamect*pst)

{

pst->letters=strlen(pst->fname)+strlen(pst->lname);

}

voidshowinfo(conststructnamect*pst)

{

printf("%s%s,yournamecontains%dletters.\n",pst->fname,pst->lname,pst->letters);

}

结构作为参数的例子:

//要求输入名和姓,然后得到姓名中的字母总数

#include

#include

structnamect{

charfname[20];

charlname[20];

intletters;

};

structnamectgetinfo(void);//函数返回类型为struct

structnamectmakeinfo(structnamect);

voidshowinfo(structnamect);

intmain(void)

{

structnamectperson;

person=getinfo();

person=makeinfo(person);//传递的参数为结构

showinfo(person);

return0;

}

structnamectgetinfo(void)

{

structnamecttemp;//创建一个新的结构

printf("Pleaseenteryourfirstname.\n");

gets(temp.fname);

printf("Pleaseenteryourlastname.\n");

gets(temp.lname);

returntemp;

}

structnamectmakeinfo(structnamectinfo)//创建一个新的结构

{

info.letters=strlen(info.fname)+strlen(info.lname);

returninfo;

}

voidshowinfo(structnamectinfo)///创建一个新的结构

{

printf("%s%s,yournamecontains%dletters.\n",info.fname,info.lname,info.letters);

}

14.7.5结构,还是指向结构的指针

1)为提高效率,使用结构指针作为函数参数,当要保护数据、防止意外改变数据时对指针使用const限定词

2)处理小型结构时常用传递结构值的方法;

14.8把结构内容保存到文件中

14.9结构:

下一步是什么

14.10联合介绍

定义:

一个能在同一个存储空间里(但不同时)存储不同类型的数据类型。

联合的定义:

联合模板、联合变量、联合标记

Unionhold

{

intdigit;

doublebigfl;

charletter;

};

unionholdfit;

//其中hold为联合标记,fit为联合变量,方括弧为联合模板;

联合的初始化:

1)初始化为同样的另外一个联合

2)初始化联合的第1个元素

3)指定初始化项目

14.11枚举类型

定义:

枚举是一种代表整数常量的符号名称;

注:

enum常量是int类型的,因此在使用int类型的任何地方都可以使用它。

枚举类型的目的是提高程序的可读性。

默认情况下,枚举列表中的常量被指定为整数值0、1、2等等。

可以指定常量具有的值。

例如:

enumlevels{low=100,medium=500,high=2000};

如果只对某一个常量赋值,而没有对后面的常量赋值,那么这些后面的常量会被赋予后续的值。

例如:

enumfeline{cat,lynx=10,puma,tiger};

则对应值的一次为0,10,11,12。

14.12typedef简介

定义:

typedef工具是一种高级数据特性,能为某一类型创建自己定义的名字。

Typrdef与#define的区别:

1)typedef给出的符号名称仅限于对类型,而不是对值;

2)typedef的解释由编译器,而不是预处理器执行

3)typedef比#define更灵活

使用方法:

typedefunsignedcharBYTE;随后就可以用BYTE来定义变量了。

即typedefbA其中b为类型,A为字符名称

用typedef来命名一个结构类型时,可以省去结构的标记。

注意:

typedef并不是创建新的类型,只是创建了便于使用的标签。

14.13奇特的声明

C语言中,当进行一个声明时,可以添加修饰符来修饰名称或标示符。

一共包含3个修饰符:

*、()、[]

这3个修饰符的使用规则:

1)优先级:

()、[]优先级一样,高于*

2)()、[]顺序从左向右组合

14.14函数和指针

指向函数的指针:

保存着指向函数代码起始处的地址

声明一个函数指针时,必须声明它指向的函数类型(包括函数返回类型、函数的参量类型)。

viod(*pf)(char*)//pf是一个指向函数的指针,(*pf)为一个函数,(char*)为该函数的参量列表,void作为其返回类型。

函数名可以用来表示函数的地址。

 

第16章C预处理器和C库

C预处理器:

因为在编译程序之前,先由预处理器检查程序

16.1翻译程序的第一步

1)首先将源代码中出现的字符映射到源字符集;

2)第二,将两个物理行转换成一个逻辑行;

3)其次,编译器将文本划分成预处理的语言符号序列、空白字符及注释序列。

16.2明显常量:

#define

每个#define行由3部分组成:

#definePXprintf(“xis%d.\n”,x);

第1部分第2部分第3部分

第1部分:

#define本身

第2部分:

缩略语,称为宏

第3部分:

类对象宏(主体)

宏展开:

预处理器在程序中发现了宏的实例后,总会用实体代替该宏,从宏变成最终的替换文本的过程称为宏展开;

预处理器不进行计算,只是按照指令进行文字替换操作。

但是在双引号中的宏却不会进行替换,例

#defineTWO2

#defineOW“ABC”

Printf(“TWO:

OW”);则打印的结果是TWO:

OW

16.2.1语言符号

16.2.2重定义常量

假设将LIMIT定义为20,后来在该文件中又把LIMIT定义为25,这个过程被称为重定义常量

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1