C语言学习琐记二

51.      文件包含命令是C语言程序常用的一个预处理命令,它的格式:#include (文件名),它的功能就是将指定的被包含的内容放置在文件包含命令出现的地方,一般写在一个文件的开头,被包含的.h文件中往往是一些该程序所需要的一些说明或定义,它包括符号常量的定义、类型定义、带参数的宏定义、数组、结构、联合和枚举的定义等等,它还包含外部变量的定义,函数的定义和说明等。

52.      使用文件包含命令时应注意事项:1.一个文件包含命令只能包含一个文件,如某个程序需包含多个文件,则可使用多条文件包含命令,如:#include “xy.h” #include “mn.h”。2.文件包含的定义可以嵌套,是指在一个被包含的文件中还可以包含其他文件。3.文件包含命令中,#include<文件名>,表示所引用的被包含是系统提供的。#include “文件名”,表示所引用的被包含文件可能是用户自己定义的。编程人员对自己定义的被包含文件,引用时使用双引号,而系统提供的.h文件最好使用尖括号,这样查找可能快些。4.为提供程序的可移植性,编程时先将一些在不同环境或条件下需要修改的量或需修改部分放在一个被包含的文件中。

53.      条件编译指的是对编译的源程序的某种控制,即根据不用的条件来控制源程序参加编译内容,称为条件编译。

54.      条件编译常用命令格式:1.#ifdef (标识符) <程序段1> #else<程序段2>#endif 该格式的功能描述如下,当(标识符)被宏定义时,<程序段1>中的语句或命令参加编译,否则<程序段2>中的语句或命令参加编译。2.#ifndef(标识符) <程序段1> #else <程序段2> #endif 该格式的功能是:当(标识符)未被宏定义时,<程序段1>中的语句或命令参加编译,否则<程序段2>中的语句或命令参加编译。3.#if(表达式) <程序段1> #else <程序段2> #endif 该格式的功能是:当表达式是非0值时,则<程序段1>参加编译,否则<程序段2>参加编译。

55.      1.条件编译可以用来提高程序的通用性。2.条件编译会给程序调试带来方便。3.使用条件编译替代if语句会减少目标代码的长度。

56.      类型定义指根据某种需要对已有的类型用一种新的类型名字来替代,其定义语句格式如下:typedef (已有类型说明符) (新类型名表)

57.      类型定义语句在使用时应注意如下事项:1.该语句只是对已有的类型定义一个新名。2.使用该语句时,习惯将新定义的类型名用大写字母。3.类型定义可以嵌套,所谓嵌套,是指用该语句定义的新的类型名再用来定义新的类型。4.常把使用该语句定义的数据类型包含在某个头文件中。5.在使用中会看到typedef语句与#define有相似之处,但三者实际不同。#define在编译的预处理完成,只是简单的替换,而typedef语句在编译时处理,它不是替换。

58.      1.使用类型定义可以简化书写,将一个复杂的类型定义成简单的新类型名。2.使用类型定义会给一些变量带来更多的有用信息。3.使用类型定义,用新类型定义的变量在编译时做类型检查,从而增加安全性。

59.      指针是用来存放某个变量的地址值的,当然被存放地址值的那个变量已经定义过,并且被分配了确定的内存地址值。一个指针存放了哪个变量的地址值,就说该指针指向那个变量。

60.  指针的类型是该指针所指向的变量的类型,而不是指针本身值的类型,指针本身值是内存的地址值,其类型自然是int型或long型。

61.  函数的地址值用该函数的函数名来表示,指向函数的指针可用它所指向的函数名来赋值。

62.  结构变量的指针用&运算符加结构变量名表示,结构变量的成员的地址也用&运算符加结构变量的成员名来表示。

63.  在float m[3][2]、*p1[3]、(*p2)[2]中,m是一个二维数组名,p1是一个一维一级指针数组名,所谓指针数组就是数组的元素为指针的数组。数组p1有3个元素,每个元素是一级指针。p2是一个指向数组的指针,它指向一个每列有2个元素的二维数组。

64.  指向函数的指针表示如下:int (*pf)(),pf是一个指向函数的指针,它指向的函数的返回值为int型。

65.  指针函数表示如下:int *pf(),pf是一个返回值为int型数的指针函数,所谓 指针函数是一种返回值为指针的函数。

66.  给指针赋值有一种常用的方法,就是使用存储管理函数malloc(),该函数的格式:(void *)malloc(int size),该函数用来分配内存地址的,size用来表示所申请内存大小的字节数,该函数分配的内存地址值可用来存放所指定的任何类型变量的地址值,该函数如果成功分配了内存地址,则返回一个地址值,否则,返回NULL(0地址),表示申请分配内存失败。如:char *s;s=(char*)malloc(10*sizeof(char));,通过调用系统提供的malloc()函数,申请10*sizeof(char)个字节的内存空间,若申请成功,s将获得一个地址,该地址值是内存中某个空间的首地址,若s的值为NULL,则申请失败,没有获得内存空间。

67.  指针赋值时注意事项:1.指针被定义后,只有赋了值才能使用。2.给指针赋值时一定要注意类型的的一致。3.可将一个已赋值的指针赋给另一个同类型的指针。4.暂时不用的指针可以赋值NULL。5.指针也可以被赋一个整型数值,但是使用这种赋值方法要十分慎重,对于内存分配情况不清楚的人,最好不要作这样的尝试。

68.  ‘*’作为单目运算符是用来表示指针所指向变量的值,或者称为指针所指的内容。

69.  一个指针可以加上或减去一定范围内的一个整数,以此来改变指针的地址值,需要注意的是p++不是简单地把p的值加1,而是将p的值加1倍它所指向的变量占用的内存字节数。

70.  两个指针相减运算:在一定条件下,两个指针可以相减,而不是任意两个指针都可以相减。指向同一个数组的两个不同元素的指针相减,则表示两个指针相隔元素的个数。

71.  任意毫无关联的两个指针进行比较是毫无意义的。指向同一个数组的两个指针可以进行比较。如果两个指向同一个数组的指针相等,则表示这两个指针指向同一个元素。

72.  如果p是一个指针,p+1表示指针加1,而(int)p+1则表示地址加1。

73.  数组元素的存取允许两种方式:1.下标方式。2.指针方式。为了提高效率应尽量使用指针方式为好。数组名是一个常量指针。

74.  以b[3][5]为例,二维数组的元素各种表示归结:1.下标表示:b[i][j]。2.一级指针表示:*(&b[0][0]+5*i+j)。3.行用下标列用指针表示:*(b[i]+j)。4.行用指针列用下标表示:*(b+i)[j]。5.二级指针表示:*(*(b+i)+j)。

75.  依二维数组元素的表示方法类推,三维数组有9种表示方法。以c[3][5][7]为例,三维数组元素可表示为:1.行列用下标,组用指针表示,*(b[i][j]+k)。2.行组用下标,列用指针表示:*(b[i]+j)[k]……

76.  字符串比较函数1.strcmp(s1,s2)。2.strncmp(s1,s2,n)。参数s1,s2可以是数组名,也可以是指针名。后面函数执行时只将s1和s2字符串中前n个字符进行比较,其余字符不作比较。

77.  检索字符函数1.strindex(s,c)。2.strnindex(s,c),s表示指定字符串的数组名或字符指针名,c是一个char变量,用来指定要检索的字符。该函数返回一个指针,指示指定字符在字符串中的位置,若不包含,则返回NULL。区别:后一个函数从右至左开始检索。

78.  字符串连接函数1.strcat(s1,s2)。2.strncat(s1,s2,n)。执行该函数将s2字符连接到s1字符的尾部并去掉’\n’。区别:后一个函数将s2字符串的前n个字符连接到s1字符串,其余丢弃。该函数返回一个指针,指向新字符串的首地址。注意:使用该函数时,s1必须有足够大的空间s2,越界不报错将造成数据混乱。

79.  字符串复制函数1.strcpy(s1,s2)。2.strncpy(s1,s2,n)。s1,s2可以是字符数组名或字符指针名,s2也可以是字符串常量,n为整型变量或常量。执行该函数将s2的字符串复制到s1中,s1原有的字符串被覆盖,要求s1数组大小能容纳s2。区别:后一个函数s2前n个字符复制到s1,其余丢弃,返回新复制字符串首地址。

80.  指针数组定义格式:<类型说明符>*<数组名>[<大小>];指向一维数组的指针定义格式:<类型说明符> (*<数组名>)[<大小>]。

81.  指向函数的指针定义格式:<类型说明符>(*<指针名>)( )。int (*pf)( ),pf是指向函数的指针名,该指针所指向的函数的返回值是int型数。

82.  一个函数存放在内存中的入口地址是用函数名表示的,类似于数组,因此,给指向函数的指针赋值时只需用函数名。用指向函数的指针调用函数时,格式为:(*指针名)(<实参表>)。

83.  定义结构体的结构类型:struct  <结构名>{ 结构成员说明};结构变量和指向结构变量的指针可以做结构的成员,但是,某类结构的结构变量可以是另一类结构的结构成员,而不可说本身结构的结构变量。指向结构变量的指针可以是本身结构的成员。

84.  结构变量的定义:struct <结构名> <结构变量名表>。

85.  在定义结构模式后,可以马上定义结构变量:struct <结构名>{结构成员说明}<结构变量名表>;

86.  结构名,结构成员名,结构变量是三个不同的概念,允许同名。

87.  结构变量的成员有两种表示方法:1.结构变量的成员:<结构变量名>.<结构成员名>。2.指向结构变量的指针的成员:1.<指向结构变量的指针名>-><结构变量名>;2.(*(指向结构变量指针名)).<结构变量名>。

88.  可将一个结构变量整个地赋给另一个结构变量,但是要求两者是同一种结构模式的结构变量。

89.  位段是一种压缩信息的方法,它所使用的是一种结构的数据形式。该方法是在结构中定义特殊的成员,该成员以位为单位定义长度的。其定义格式如下:unsigned <成员名>:<二进制位数>。

90.  使用位段应注意的事项:1.位段在内存中的分配方向与机器有关。有的机器从高字节向低字节分配,有的机器从低字节向高字节分配。2.在位段的同一结构中还可以包含不同类型的其他数据类型项。3.在位段结构中可以定义无名无名位段,它可以用来作为位段的分隔。4.长度为0的位段用来使字边界对齐,使用长度为0 的位段可以使下一个位段从新的字开始。5.一个位段不能跨越两个字,只能存放在同一个字中。如果前面的几个位段几乎占满一个字,空下来的不足以存放下一个位段时,该位段只好从下一个字开始。6.不能构造位段数组,也不能对位段进行地址操作。7.位段可以用整型格式输出,位段可在表达式中引用,系统自动将位段转化为int型数。8.位段不能定义在联合中,也不能作为函数的返回值。

91.  联合与结构很相似,区别在与结构是异址的,而联合是同址的。枚举在定义形式上跟结构、联合相似,但它却是另一中类型,它是若干常量的集合。

92.  联合变量中的成员共用一个内存单元,即联合变量的所以成员共用一个内存地址值。因此,在联合变量中起作用的成员是最近一次被赋值的成员,因为一个联合变量的所有成员共用一个内存地址,存入新的成员值时,原来的成员值边失去了意义。

93.  在赋初值时,联合变量只能给第一个成员赋初值,不能对联合变量名赋值,不能用联合变量作函数的参数,也不能用联合变量作函数的返回值,只能用指向联合变量的指针作函数的参数。

94.  枚举模式的定义格式如下:enum <枚举名>{<枚举表>}。枚举表是由若干个枚举符构成的,多个枚举符之间用逗号(,)分隔。枚举符又称枚举元素或枚举常量,它是一种标识符,并且有确定的int型值。

95.  枚举变量的定义格式如下:enum <枚举名><枚举变量名表>。<枚举变量名表>是由若干个用逗号隔开的枚举变量名构成的。

96.  定义后枚举变量应先赋值,然后再引用,否则没有意义。枚举变量应被赋一个它所对应的枚举符表中的一个枚举符。

97.  不能直接给枚举变量赋一个整型数值。如:enum day{Sun,Sat,……}day1,day2;day1 = 0;这是错误的。但day1 = (enum day) 0;这是正确的。

98.  在默认情况下,枚举表中枚举符的值是从0开始的,后一个总是比前面大1.另外,在定义枚举格式时,可以通过显示赋值的方法确定枚举符的值。如:enumday{Sun = 7,Sta = 6,……};

99.  使用枚举变量时应注意的事项:1.枚举符不是整型变量,不能在程序中对它赋以数值。2.枚举变量一般用它所对应的枚举表中的枚举符来赋值。如果用整型数来赋值,前面要加上强制类型转换符。输出枚举变量时,要用输出格式符%d。3.枚举变量可以进行比较运算,比较时按其枚举符所隐含的枚举值进行。4.枚举变量可以用作函数的参数或返回值。

100.  C语言文件被称为流式文件,其特点是不分记录或块,将文件看成是信息流或是看成一个字符流(文本文件),或看成是一个二进制流(二进制文件)。文件的存取是以字符(字节)为单位的,读写数据流的开始和结束受程序控制。任何一个文件都是以EOF结束,最简单的文件是只有结束符的空文件。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值