2022年C语言的特点 .pdf

上传人:Che****ry 文档编号:34883777 上传时间:2022-08-19 格式:PDF 页数:13 大小:119.95KB
返回 下载 相关 举报
2022年C语言的特点 .pdf_第1页
第1页 / 共13页
2022年C语言的特点 .pdf_第2页
第2页 / 共13页
点击查看更多>>
资源描述

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

1、1 C 语言的特点语言简洁、紧凑,使用方便、灵活。共有个关键字,种控制语句。运算符丰富,公有种运算符。数据结构丰富,数据类型有: 整型、 实型、字符型、 数组、 指针、结构体、 共用体等。具有结构化的控制语句(如if else 、while 、dowhile 、switch、for)语法限制不太严格,程序设计自由度大。允许直接访问物理地址,能进行位(bit)操作,可以直接对硬件操作。生成目标代码质量高,程序执行效率高。可移植性好。2 C 语言的用途C 虽不擅长科学计算和管理领域,但对操作系统和系统实用程序以及对硬件进行操作方面, C 有明显的优势。现在很多大型应用软件也用编写。 c 的种控制语

2、句:if() else for() while() dowhile() continue break switch goto return 程序的三种基本结构:顺序结构,选择结构,循环结构数据输出c 语言不提供输入输出语句,输入输出操作是由c 的库函数完成。但要包含头文件stdio.h。putchar( ) 向终端输出一个字符printf( ) 的格式字符: d 格式符用来输出十进制整数%d 按整型数据的实际长度输出%md 使输出长度为m,如果数据长度小于m,则左补空格,如果大于m,则输出实际长度%ld 输出长整型数据 o 格式符以八进制形式输出整数 x 格式符以十六进制形式输出整数 u 格式

3、符用来输出 unsigned 型数据,以十进制形式输出 c 格式符用来输出一个字符 s 格式符输出一个字符串%s输出实际长度字符串%ms 输出的串占m 列,如果串长度小于m,左补空格,如果大于m,实际输出%-ms 输出的串占m 列,如果串长度小于m,右补空格,%m.ns 输出占 m 列,但只取字符串中左端n个字符并靠右对齐%-m.ns m、n 含义同上,靠左对齐,如果nm,则 m 自动取 n值 f 格式符以小数形式输出实数%f 整数部分全部输出,小数部分输出6 位名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 -

4、- - - - - - 第 1 页,共 13 页 - - - - - - - - - %m.nf 输出数据共占m 列,其中有n 位小数。如果数值长度小于m,左补空格%-m.nf 同上,右补空格 e 格式符以指数形式输出实数%e 系统指定位小数,5 位指数( e+002 ) g 格式符输出实数,根据数值大小,自动选f 格式或 e 格式3数据输入getchar( ) 从终端输入一个字符scanf( 格式控制 ,地址列表 ) 标准 C scanf 中不使用 %u, 对于 unsigned 型数据,以%d 或%o 或%x输入。后的 * ,用来跳过它相应的数据。输入数据时不能规定精度如scanf( %7

5、.2f, &a );是不合法的。1 关系运算符:c 提供种关系运算符( = = != )前四种优先级高于后两种。2 If 语句C 提供了三种形式的if 语句If(表达式 ) 语句If(表达式 ) 语句 1 else 语句 2 If(表达式 1) 语句 1 Else if( 表达式 2) 语句 2 else 语句 n 3 条件运算符(ab)?a:b 条件为真,表达式取值a,否则取值b 4 Switch 语句Switch(表达式 ) case 常量表达式:语句; break; case 常量表达式:语句2; break; case 常量表达式n:语句 ; break; default :语句 ;

6、1 几种循环语句goto 语句(现已很少使用)while 语句先判断表达式后执行语句do-while 语句先执行语句后判断表达式for 语句2 Break 语句和 continue 语句Break 语句用于跳出循环,continue 用于结束本次循环。1 一维数组名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 13 页 - - - - - - - - - c 规定只有静态存储(static)和外部存储(extern)数组才能初始化。给数组初始化时可以不指定数组长度。2 二

7、维数组3 字符数组部分字符串处理函数puts(字符数组 )将一个字符串输出到终端。gets(字符数组 ) 从终端输入一个字符串到字符数组,并且得到一个函数值,为该字符数组的首地址strcat(字符数组 ,字符数组2)连接两个字符数组中的字符串,数组1 必须足够大。Strcpy(字符数组 ,字符串 2)将字符串拷贝到字符数组中。Strcmp(字符串 1,字符串 2) 比较字符串,相等返回0,字符串 字符串 2,返回正数,小于返回负数。Strlen(字符数组 ) 求字符串长度。Strlwr( 字符串 )将字符串中的大写字母转换成小写Strupr( 字符串 ) 将字符串中的小写字母转换成大写以上是一

8、些比较常用的字符串处理函数。1 关于形参和实参的说明 在函数被调用之前,形参不占内存 实参可以是常量、变量或表达式 必须指定形参的类型 实参与形参类型应一致 实参对形参的数据传递是值传递 ,即单向传递2 函数返回值如果想让函数返回一个值,在函数中就要用return 语句来获得, 在定义函数时也要对函数值指定类型,如果不指定,默认返回整型。3 函数调用1)注意在函数调用时实参和形参的个数、类型应一一对应。 对实参表求值的顺序是不确定的,有的系统按自左至右,有的系统则按自右至左的顺序。这一点要注意。2)函数调用的方式:函数语句,函数表达式,函数参数3)如果主调函数和被调函数在同一文件中,并且主调函

9、数在前,那么一般要在主调函数中对被调函数进行说明。除非:(1)被调函数的返回值类型为整型或字符型(2)被调函数出现在主调函数之前。4)对函数的说明和定义是不同的,定义是指对函数功能的确立,包括指定函数名,函数值类型,形参及其类型、函数体等。 说明则只是对已定义的函数返回值类型进行说明,只包括函数名、函数类型以及一个空的括弧,不包括形参和函数体。5)c 语言允许函数的递归调用(在调用一个函数的过程中又出现直接或间接的调用该函数本身)。4 数组作为函数参数1)数组元素作为函数参数和一般变量相同2)数组名作参数应该在主调和被调函数分别定义数组,形参数组的大小可以不定义。注意:名师资料总结 - - -

10、精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 13 页 - - - - - - - - - 数组名作参数,不是单向传递。3)多维数组作参数,在被调函数中对形参数组定义时可以省略第一维的大小说明,但不能省略第二维或更高维的说明。5 局部变量和全局变量从变量作用域角度分,变量可分为局部变量和全局变量。1)内部变量(局部变量)在一个函数内定义,只在函数范围内有效的变量。2)外部变量(全局变量)在函数外定义, 可以为本文件其它函数所共用,有效范围从定义变量的位置开始到本文件结束。建议尽量少使用全局变量

11、,因为它在程序全部执行过程中都占用资源,而且使函数的通用性降低了。如果在定义外部变量之前的函数要想使用该外部变量,则应在该函数中用extern 作外部变量说明。6 动态存储变量与静态存储变量从变量值存在的时间(生存期) 角度来分,可分为静态存储变量和动态存储变量。静态存储指在程序运行期间给变量分配固定的存储空间,动态存储指程序运行期间根据需要动态的给变量分配存储空间。C 语言中,变量的存储方法分为两大类:静态存储类和动态存储类,具体包括:自动的(auto) ,静态的 (static),寄存器的 (register),外部的 (extern)。1) 局部变量的存储方式函数中的局部变量如不作专门说

12、明,都之auto 的,即动态存储的,auto 可以省略。局部变量也可以定义为static 的,这时它在函数内值是不变的。静态局部变量如不赋初值,编译时自动赋值为,动态局部变量如不赋初值,则它的值是个不确定的值。C 规定,只有在定义全局变量和局部静态变量时才能对数组赋初值。为提高执行效率,c 允许将局部变量值放在寄存器中, 这种变量叫register 变量, 要用 register 说明。 但只有局部动态变量和形式参数可以作为 register 变量,其它不行。2) 全局变量的存储方式全局变量在函数外部定义,编译时分配在静态存储区,可以在程序中各个函数所引用。多个文件的情况如何引用全局变量呢?假

13、如在一个文件定义全局变量,在别的文件引用,就要在此文件中用extern 对全局变量说明,但如果全局变量定义时用static 的话,此全局变量就只能在本文件中引用了,而不能被其它文件引用。3) 存储类别小结从作用域角度分,有局部变量和全局变量局部变量:自动变量,即动态局部变量(离开函数,值就消失)静态局部变量(离开函数,值仍保留)寄存器变量(离开函数,值就消失)(形参可定义为自动变量和寄存器变量)全局变量:静态全局变量(只限本文件引用)全局变量(允许其它文件引用)从存在的时间分,有静态存储和动态存储动态存储:自动变量(本函数内有效)寄存器变量(本函数内有效)形参名师资料总结 - - -精品资料欢

14、迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 13 页 - - - - - - - - - 静态存储:静态局部变量(函数内有效)静态全局变量(本文件内有效)全局变量(其它文件可引用)从变量值存放的位置分静态存储区:静态局部变量静态全局变量全局变量动态存储区:自动变量和形参寄存器内:寄存器变量7 内部函数和外部函数内部函数:只能被本文件中的其它函数调用,定义时前加static,内部函数又称静态函数。外部函数:可以被其它文件调用,定义时前加extern,如果省系统略,则隐含为外部函数,在需要调用此函数的文件

15、中,一般要用extern 说明。c 编译系统在对程序进行通常的编译之前,先进行预处理。c 提供的预处理功能主要有以下三种: 1)宏定义2)文件包含3)条件编译1 宏定义不带参数的宏定义用一个指定的标识符来代表一个字符串,形式:#define 标识符 字符串几点说明:) 宏名一般用大写) 宏定义不作语法检查,只有在编译被宏展开后的源程序时才会报错) 宏定义不是c 语句,不在行末加分号) 宏名有效范围为定义到本源文件结束) 可以用 #undef 命令终止宏定义的作用域) 在宏定义时,可以引用已定义的宏名带参数的宏定义定义形式: #define 宏名(参数表)字符串这和函数有些类似,但他们是不同的:

16、) 函数调用时,先求实参表达式值,再代入形参,而宏只是简单替换,并不求值) 函数调用是在程序运行时分配内存的,而宏展开时并不分配内存,也没有返回值的概念) 对函数中的实参和形参都要定义类型,而且要求一致,宏名无类型,其参数也没有类型。) 函数只有一个返回值,而宏可以得到几个结果) 宏替换不占运行时间,只占编译时间,而函数调用占运行时间2 文件包含处理#include 文件 1 就是将文件1 的全部内容复制插入到#include 位置,作为一个源文件进行编译。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - -

17、 - - - - 第 5 页,共 13 页 - - - - - - - - - 在#include 命令中,文件名可以用 也可以用 ,假如现在file1.c 中包含 file2.h 文件, 表示系统先在file1.c 所在目录中找file2.h , 如果找不到, 再按系统指定的标准方式检索目录,表示系统直接按指定的标准方式检索目录。所以用 保险一点。3 条件编译条件编译指不对整个程序都编译,而是编译满足条件的那部分。条件编译有以下几种形式:1)#ifdef 标识符程序段 #else 程序段#endif 它的作用:当标识符在前面已经被定义过(一般用#define),则对程序段编译,否则对程序段编

18、译。) #ifndef 标识符程序段#else 程序段#endif 它的作用和 #ifdef 相反,当标识符没被定义过,对程序段编译,否则对程序段编译。) #if 表达式程序段#else 程序段#endif 它的作用:当表达式值为真(非)时,对程序段编译,否则对程序段编译。指针说白了就是地址。指针变量就是用来存放指针(地址)的变量。1 变量的指针和指向变量的指针变量读起来很拗口, 说白了就是变量的地址和用来存放变量地址的地址变量。因为一个变量在编译的时候系统要为它分配一个地址,假如再用一个变量来存放这个地址,那么这个变量就叫做指向变量的指针变量,也就是用来存放变量地址的这么一个变量。所谓 指向

19、 就是指存放 的地址, 如指向变量的指针变量,指向 就是指用来存放变量的地址,再如指向数组的指针变量, 指向 就是指存放数组的地址。只要理解了这个,指针也就不难了。另外,还有指向字符串的指针变量,指向函数的指针变量,指向指针的指针变量等。1) 指针变量的定义形式:类型标识符*标识符如: int *pointer; 要注意两点: * 表示 pointer 是个指针变量,在用这个变量的时候不能写成*pointer , *pointer是 pointer 指向的变量。一个指针变量只能指向同一个类型的变量。如上面pointer 只能指向int 型变量。2)指针变量的引用两个有关的运算符:& 取地址运算

20、符 &a 就代表变量a 的地址* 指针运算符*a就代表变量a 的值名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 13 页 - - - - - - - - - 2 数组的指针和指向数组的指针变量数组的指针指数组的起始地址,数组元素的指针指数组元素的地址。1)指向数组元素的指针变量的定义与赋值定义和指向变量的指针变量定义相同,c规定数组名代表数组的首地址,即第一个数组元素地址。2)通过指针引用数组元素我们通常引用数组元素的形式是ai ,如果用指针可以这样引用,*(a+i)

21、,或定义一个指针变量 p,将数组a 的首地址赋给p,p=a;然后用 *(p+i) 引用。注意:指针变量指向数组a 首地址,则p+指向数组的下一元素地址,即a1的地址。3)数组名作函数参数形参数组和实参数组之间并不是值传递,而是共用同一段地址,所以在函数调用过程中如果形参的值发生变化,则实参的值也跟着变化。4)指向多维数组的指针和指针变量以二维数组为居多。假设定义了一个二维数组a34 ,那么a 代表整个二维数组的首地址,也代表第0 行的首地址,同时也是第0 行第 0 列的元素的首地址。 a +0 和 a0代表第 0 行首地址, a+1 和 a1代表第一行的首地址。假设 a 是一个数组的首地址,那

22、么如果a 是一维的, a+I 代表第 I 个元素的地址,如果a 是二维的,则a+I 代表第 I 行的首地址。那么第一行第二列的元素地址如何表示呢?a1+2 或 &a12 或*(a+1)+2 。我们只要记住: 在二维数组中a代表整个数组的首地址,aI代表第 I 行的首地址, aI 与*(a+I)等价就行了。只要运用熟练了就没什么复杂的了。5)指向由 m 个整数组成的一维数组的指针变量如: int (*p)4 , p 是一个指向包含4 个元素的一维数组, 如果 p 先指向 a0, 则 p+1 指向 a1,即 p 的增值是以一维数组的长度为单位的,这里是4,举个例子:假设 a34=1,3,5,7,9

23、,11,13,15,17,19,21,23, p先指向 a0也就是数组a 的首地址, 那么 p+1就是 a1的首地址即元素9 的地址, 因为在定义p 时 int (*p)4 ,定义一维数组长度为4,所以 p+1 就等于加了一个一维数组的长度4。3 字符串的指针和指向字符串的指针变量1)字符串的表示形式c 中字符串有两种表示形式:一种是数组,一种是字符指针char string=I love c!; char *str=I love c!; 其实指针形式也是在内存中开辟了一个数组,只不过数组的首地址存放在字符指针变量str中,千万不要认为str 是一个字符串变量。2)字符串指针作函数参数实际上字

24、符串指针就是数组的首地址。3)字符指针变量与字符数组的区别 字符数组由若干元素组成,每个元素存放一个字符,而字符指针变量只存放字符串的首地址,不是整个字符串 对数组初始化要用static,对指针变量不用。 对字符数组赋值,只能对各个元素赋值,不能象下面这样:char str14; str=I love c!; 对指针变量可以,char *str; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 13 页 - - - - - - - - - str=I love c!; 注

25、意:此时赋给str 的不是字符,而是字符串首地址。 数组在定义和编译时分配内存单元,而指针变量定义后最好将其初始化,否则指针变量的值会指向一个不确定的内存段,将会破坏程序。如:char *a; scanf( %s, a ); 这种方法是很危险的,应该这样:char *a, str10; a = str; scanf( %s, a ); 这样字符指针就指向了一个确定的内存段。 指针变量的值是可以改变的,而字符数组名所代表的字符串首地址却是不能改变的。4 函数的指针和指向函数的指针变量一个函数在编译时被分配一个入口地址,这个入口地址就称为函数的指针。函数名代表函数的入口地址, 这一点和数组一样。我

26、们可以用一个指针变量来存放这个入口地址,然后通过该指针变量调用函数。如:假设有一个求两者较大的函数如下:int max( int x, int y ); 当我们调用这个函数时可以这样:int c; c=max( a, b );这是通常调用方法,其实我们可以定义一个函数指针,通过指针来调用,如:int (*p)(); / 注意指向函数指针变量的定义形式p=max; /此句就是将函数的入口地址赋给函数指针变量p c=(*p)( a, b ); 有些朋友可能对(*p)() 不大理解, 其实它的意思就是定义一个指向函数的指针变量p,p不是固定指向哪个函数的,而是专门用来存放函数入口地址的变量。在程序中

27、把哪个函数的入口地址赋给它,它就指向哪个函数。但要注意,p 不能象指向变量的指针变量一样进行p+,p-等无意义的操作。既然 p 是一个指针变量, 那么就可以作为函数的参数进行传递。其实函数的指针变量最常用的用途之一就是作为函数参数传递到其它函数。这也是c 语言中应用的比较深入的部分了。5 返回指针值的函数我们知道, 一个函数可以带回一个整型值、字符值、实型值等,函数还可以带回一个指针型的数据,即地址。这种函数的定义形式如下:类型标识符 *函数名 (参数表 ) 如: int *a(x,y) 返回一个指向整型的指针使用这种函数的时候要注意:在调用时要先定义一个适当的指针来接收函数的返回值。这个适当

28、的指针其类型应为函数返回指针所指向的类型。这样的函数比较难于理解,其实只要把它当做一般的函数来处理就容易了。当我们觉得指针难于理解的时候,就把它暂时当做整型来看,就好理解多了。6 指针数组指针数组无疑就是数组元素为指针,定义形式为:类型标识*数组名 数组长度 如:int *p4 ,千万不要写成int (*p)4 ,这是指向一维数组的指针变量。指针数组多用于存放若干个字符串的首地址,注意一点,在定义指针数组时初始化,如下:static char *name=Li jing,Wang mi,Xu shang; 不要以为数组中存放的是字符串,它存放的是字符串首地址,这一点一定要注意。7 指向指针的指

29、针名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 13 页 - - - - - - - - - 说的明白一点, 将一个指针再用一个变量来存放,那么这个变量就是指向指针的指针。定义如: char * *p; 8 指针数组作main()函数的参数函数形式为main( int argc, char *argv ) main 函数的参数是从命令行得到的,argc 指命令行参数个数,注意命令名也算一个参数,命令行参数都是字符串,他们的首地址构成一个指针数组argv。Main 函数的

30、形参用argc 和argv 只是一个习惯,也可以定义成别的名字。9 指针小结1)有关指针的数据类型定义 含义Int I; 定义一个整型变量I Int *p; P 为指向整型数据的指针变量Int an; 定义整型数组a,它有 n 个元素Int *pn; 定义指针数组p,它有 n 个指向整型的指针元素Int (*p)n; P为指向含有n 个元素的一维数组的指针变量Int f(); F 为返回整型值的函数Int *p(); P 为返回值为指针的函数,该指针指向整型数据Int (*p)(); P 为指向函数的指针,该函数返回一个整型值Int *p; 定义一个指向指针的指针变量2)ANSI 新增了一种v

31、oid * 指针类型,即定义一个指针变量,但不指向任何数据类型,等用到的时候再强制转换类型。如:char *p1; void *p2; p1 = (char *)p2; 也可以将一个函数定义成void * 型,如:void *fun( ch1, ch2 ) 表示函数fun 返回一个地址,它指向空类型,如果需要用到此地址,也要对其强制转换。如(假设 p1 为 char 型):p1=(char *)fun( c1,c2 ); 指针应该说是c 语言中比较重要的概念,也是 c 语言的精华, 它有很多优点,但用不好也会带来严重性的错误,这就需要我们多用,多练,慢慢的积累经验。1 定义结构体定义的一般形式

32、:struct 结构体名 成员列表; 定义一个结构体变量可以这样定义:struct 结构体名 结构体变量名 ; 2 结构体变量的引用在引用结构体变量时应注意以下规则:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 13 页 - - - - - - - - - 1)不能将结构体变量作为一个整体输入输出,只能对变量当中的各个成员输入输出。新标准C 允许将一个结构体变量直接赋值给另一个具有相同结构的结构体变量。3 结构体变量的初始化如:struct student long i

33、nt num; char name20; char sex; char addr20; a=89031,Li Lin,M,123 Beijing Road ; 4 结构体数组struct student stu4; 定义了一个数组stu,其元素为struct student 类型,数组有4 个元素。注意数组各元素在内存中是连续存放的。在定义结构体数组时,数组元素个数可以不指定。编译时, 系统会根据给出初值的结构体常量的个数来确定数组元素的个数。5 指向结构体变量的指针因为结构体变量在内存中是连续存放各成员的,因此我们可以将结构体变量在内存中的起始地址存放到一个变量中,那么这个变量就是指向结构体

34、变量的指针。注意将结构体变量的首地址赋给指针变量的形式:struct student stu_1; struct student *p; p=&stu_1; / 要加取地址符而指向函数和指向字符串的指针不用在对引用结构体变量中的成员时,有三种方式:以上面的结构体为例:设p 为指向此结构体变量的指针,即p=&a; 1) a.num 2) (*p).num 3) p-num 6 指向结构体数组的指针struct student *p; struct student stu4; p=stu; 则 p 为指向结构体数组的指针变量。这里应注意p+,p 指向 stu0,p+ 则指向 stu1。 P 指向的

35、是数组中一个元素的首地址,而不能让p 指向元素中的某一成员,如p=&stuI.name是不对的。7 用指向结构体的指针作函数参数虽然 ANSI C 允许用整个结构体作为函数参数,但要将全部成员值一个一个传递,开销大。所以用指针作参数,能提高运行效率。Struct student stu; 用整个结构体作为参数调用形式:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 13 页 - - - - - - - - - fun( stu ); 而且被调函数fun 中也要定义成结构

36、体变量,struct student stu; 用指针作参数调用形式:fun( &stu ); 被调函数fun 中定义成指针变量,struct student *p; 8 用指针处理链表链表是一种重要的数据结构,原因就在于它可以动态的进行存储分配。链表都有一个头指针,用来存放整个链表的首地址。链表的定义形式如下:struct node int num; struct node *next; ; next 用来存放下一节点的地址。如何进行动态的开辟和释放存储单元呢?c 提供了以下有关函数:1) malloc(size) 在内存的动态存储区开辟一个长度为size 的连续空间。 成功返回空间首地址,

37、失败返回0; 2) calloc(n,size) 在内存的动态存储区开辟n 个长度为 size的连续空间。 成功返回空间首地址,失败返回0; 3) free(ptr) 释放由 ptr 指向的内存区。 Ptr 是最近调用一次调用malloc 和 calloc 时返回的值。上面函数中,n 和 size 为整型, ptr 为字符指针。9 共用体定义形式:union 共用体名 成员列表变量列表 ; 共用体和结构体类似,只是有一点不同,结构体中个成员的起始地址不同,结构体变量在内存中的长度为各成员长度之和;而共用体中个成员的起始地址相同,共用体变量所占的内存长度为最长的成员的长度。共用体类型数据的特点:

38、1) 同一个内存段可以存放几种不同类型的成员2) 共用体变量中起作用的成员是最后一次存放的成员3) 不能对共用体变量名赋值,不能在定义时初始化。4) 不能把共用体变量作为函数参数5) 共用体类型可以出现在结构体定义中,反之也可,也可以定义共用体数组。另外,结构体名可以作为参数,而共用体名不可以。这两中数据结构在不同场合中各有所用。10 枚举类型定义形式如下:举个例子enum weekdaysun,mon,tue,wed,thu,fri,sat; enum weekday workday,week_end; / 定义枚举变量名师资料总结 - - -精品资料欢迎下载 - - - - - - - -

39、 - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 13 页 - - - - - - - - - workday 和 week_end 被定义成枚举类型,他们的值只能为sun到 sat之一。也可以直接定义枚举变量,这一点与结构体相同enum weekdaysun,mon,tue,wed,thu,fri,satwordday,week_end; 注意:枚举元素是作为常量存在的,他们是有值的, c 在编译时使他们的值按顺序为0,1,2 如:上面的定义中,sun的值为 0,mon 的值为 1 另外:虽然枚举元素有值,但不能将一个整数直接赋给一个枚举变

40、量。应进行强制类型转换,如:workday=(enum weekday)2; 它相当于把tue 赋给了 workday。11 用 typedef 定义类型typedef 的作用就是能够让你定义一个自己喜欢的数据类型名来代替已有的数据类型名。如:typedef int INT; 那么我就可以用INT 来定义整型变量了。作用和int 一样。Typedef 用于结构体定义,如:Typedef struct Int day; Int month; Int year; DATE; DATE birthday; DATE *p; 等等用 typedef 有利于程序的通用与移植。1)概述所谓位运算是指进行二

41、进制位的运算。在系统软件中,常要处理二进制位的问题。c 提供的位运算符有:& 按位与| 按位或 按位异或 取反 右移&对于将一个单元清零、取一个数中的某些指定位以及保留指定位有很大用途。|常被用来将一个数的某些位置1。判断两个位值,不同为1,相同为0。常用来使特定位翻转等。常用来配合其它位运算符使用的,常用来设置屏蔽字。右移时,要注意符号问题。对无符号数,右移时左边高位移入0,对于有符号数,如果原来符号位为0(正数),则左边移入0;如果符号位为1(负数),则左边移入还是要取决于系统。移入的称为逻辑右移 ,移入的称为算数右移 。2)位段将一个字节分为几段来存放几个信息。所谓位段是以位为单位定义长

42、度的结构体类型中的成员。如:struct packed-data 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 13 页 - - - - - - - - - unsigned a:2; unsigned b:6; unsigned c:4; unsigned d:4; int I; data; 其中 a,b,c,d 分别占 2 位,6 位,4 位,4 位。 I 为整型,占4 个字节。对于位段成员的引用如下:data.a = 2;等,但要注意赋值时,不要超出位段定义的范

43、围。如位段成员a 定义为2 位,最大值为 3,即 (11)2,所以 data.a=5;就会取 5 的两个低位进行赋值,就得不到想要的值了。关于位段的定义和引用,有几点重要说明:若某一个段要从另一个字开始存放,可以定义:unsigned a:1; unsigned b:2; unsigned :0; unsigned c:3; (另一单元 ) 使用长度为0 的位段,作用就是使下一个位段从下一个存储单元开始存放。一个位段必须存放在用一个存储单元中,不能跨两个单元。可以定义无名位段。如:unsigned a:1; unsigned :2; (这两位空间不用) unsigned b:3; 位段的长度不

44、能大于存储单元的长度,也不能定义位段数组。1) 概述c 语言将文件看成一个字符的序列,分为ASCII 文件(文本文件)和二进制文件。即一个c文件就是一个字节流或二进制流。ASCII 文件每一个字节放一个ASCII 码,代表一个字符,输出与字符一一对应,便于逐个处理字符,但占用空间较多。二进制文件按内存中的存储形式原样输出到磁盘上,节省空间,由于输出与字符不对应,不能直接输出字符形式,一般用于保存中间结果。目前 c 对文件的处理只有缓冲文件系统一种方法,即无论是从程序到磁盘文件还是从磁盘文件到程序,数据都要先经过缓冲区,待缓冲区充满后,才集中发送。2) 文件夹类型指针在缓冲文件系统中,关键的概念

45、是文件指针。因为每个被使用的文件都在内存中开辟一个缓冲区, 来存放文件有关信息。这些信息保存在一个结构体变量中,该结构体类型是由系统定义的,取名为FILE ,在 stdio.h 中定义。FILE *fp; 定义了一个文件指针变量fp,以后对文件的操作都是通过fp 进行的。3) 文件的打开与关闭在对文件读写之前,要先打开文件。打开文件的函数为:fopen(),调用方式为:FILE *fp; fp=fopen( filename, 使用文件方式 ); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 13 页 - - - - - - - - -

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

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

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

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