2022年C语言学习笔记,悉心整理 .pdf
C 语言程序基础基本元素若干函数构成C 语言程序,必须有一个main 函数基本数据类型整数: int,short int / short, long int / long. 实数: float,double 字符: char 类型定义符基本 C 中占的字节数.NET C 中占的字节数整数short 2 2 int 2 4 long 4 4 实数float 4 4 double 8 8 字符char 1 1 注意 :1,数据在计算机中的存放是以补码的形式存放,所以计算每个数据类型的取值范围时候要注意。2,float 的有效位数是7 位, double 的有效位数是16 位3,转义字符:? ” ddd xhh ,转义字符定义一定要用这个形式。4,char 和 int 可以通用,当把字符赋值给整型变量时,采用符号扩展,把整数赋值给字符变量时,截取整数的低字节的值。5,使用 sizeof()函数可以获得变量所占的字节数常量与变量变量名用标示符表示,由字母数字下划线组成,必须是字母或者下划线开头。变量必须先定义在使用:类型标示符变量列表;可采用的定义以及赋初始值的格式:int a,b,c; a=1,b=2,c=3; 或int a=1,b=2,c=3; 可以用 #define 定义常量,例如#define PI 3.1415926 ,一般常量用大写表示,变量小写运算符和表达式算术运算符和表达式:+ - * / %(模运算 ) 两个整数相除,结果一定是整数模运算符(求余)要求两个运算对象必须是整数,结果的符号与被除数(分子)一致。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 22 页 - - - - - - - - - 赋值运算符和表达式:= = 顺序是自右到左。复合赋值运算符:+= -= *= /= %= = &= = |= 以+=为例: a+=b 等效于a=a+b; 结合顺序也是从右向左强制类型转换符号如: (int) x;将该表达式的值强制转换成int 型自增、自减: + - +i , i+, -i, i+i 先将 i 的值加 1,再使用i i+ 先使用 i 的值,再将i 的值加 1 例子: k=(i+)+(+i)+(i+) 等效于i=i+1,k=i+i+i,i=i+1,i=i+1 k=(+i)+(+i)+( +i) 等效于i=i+1, i=i+1, i=i+1,k=i+i+i 逗号运算符: “, ”优先级最低的符号形式:表达式1,表达式2,, ,表达式n 运算顺序,从左向右,最后最右边表达式n 的值是整个逗号表达式的值关系表达式及运算符关系运算,结果只能是“真”或者“假”。关系运算符含义优先级 6 6 = 6 != 7 逻辑运算逻辑运算符 & 与|有一些较为特殊的属性,由& 与|连接的表达式按从左到右的顺序进行求值,并且,在知道结果值为真或假后立即停止计算。根据定义,在关系表达式或逻辑表达式中,如果关系为真,则表达式的结果值为数值1;如果为假,则结果值为数值0。逻辑非运算符!的作用是将非0 操作数转换为0,将操作数0 转换为1。条件运算在表达式expr1 ? expr2 : expr3 中,首先计算expr1,如果其值不等于0(为真 ),则计算expr2 的值,并以该值作为条件表达式的值,否则计算expr3 的值,并以该值作为条件表达式的值。位运算C 语言提供了6 个位操作运算符。这些运算符只能作用于整型操作数,即只能作用于带符号或无符号 char、short、int、long 类型 : & 按位与( AND )| 按位或( OR) 按位异或( XOR ) 右移 按位求反运算符优先级与求值次序() ? . 从左至右! + ? + ? * (type) sizeof 从右至左名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 22 页 - - - - - - - - - * / % 从左至右+ ? 从左至右 从左至右 = 从左至右= != 从左至右& 从左至右 从左至右| 从左至右& 从左至右| 从左至右?: 从左至右= += ?= *= /= %= &= = |= = 从右至左, 从右至左一元运算符 +、&与* 匕相应的二元运算符+、 、& 与*的优先级高。顺序结构程序设计C 程序的结构C 语句:控制语句if()else;switch();case ;while();dowhile();for();continue;break;return;goto 函数调用语句例如: printf () ;表达式语句例如: a=10; b=a+10; 空语句只有一个“; ” ,用于扩展或者特殊需要复合语句把若干语句用 括起来就是复合语句C 程序的三种基本结构顺序结构分支结构循环结构基本语句赋值语句变量 =表达式;左边必须是变量,右边可以如下:变量1=变量 2=。 。 。 =表达式不可以: int a=b=c=2 ;只能 int a=2,b=2,c=2; 复合语句用 括起来,只能看成一条语句,而不是多条语句,从 开始执行,必须执行到为止名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 22 页 - - - - - - - - - 数据输出输出字符:putchar()输出一个字符例如: putchar(,a? ); putchar( ,n?) 包含在头文件stdio.h 中格式化输出及输出格式控制符printf() 函数: (特例,不需包含stdio.h 头文件 ) printf ( “格式控制字符串” ,输出表列) ;其中格式控制字符串是用双引号引起来的字符串,用于指定输出格式,包括格式说明和普通字符两种信息构成。格式说明是以%开头后跟一个格式字符组成普通字符按原样输出。输出表列是需要输出的变量或者表达式。注意:格式符%d %o %u %x %c 用于处理整形和字符型数据%s 用于处理字符串%f %e %g 用于处理实型数据允许没有输出表列,即只输出普通字符,但是格式符一定要正确要输出 %要使用 % %与格式符之间可以指定输出项的宽度和小数点后数据的位数,格式为:%m.n 格式字符。其中域宽为0 开头的数时,则输出前导0. 格式符的应用d 格式符带符号的十进制整形%d 按整形数据的实际长度输出%md 按总域宽m 位输出, m 足够大时候左边补空格,否则按实际输出%ld 输出长整形数据吗,也可以使用%mld o,x,u 格式符分别以八进制、十六进制、十进制无符号数形式输出对应的整形数据当输出的对象有符号时候,求出其补码,并将符号作为数据一部分输出。例如: int a=-1 ;printf ( “%o%u%x ”,a,a,a) ;16 位系统中输出:177777 65535 ffff 内存中存放形式:16 个 1 32 位系统中为32 个 1 c 格式符输出字符,对象可以是字符型也可以是整形对象为整形时候,先将该整数对256 求余数,将余数作为ASCII 码值输出对应的符号也可使用 %mc,m 足够大时候左边补空格例如: int a=65,b=321;printf ( “ %c %c ” ,a,b) ;结果为A A s 格式符输出字符串%s 按实际输出名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 22 页 - - - - - - - - - %ms 占 m 列,若 m 不够字符串宽度则按实际输出,m 大左补空格%-ms 同上,编程右补空格%m .ns 占 m 列,左补,若nm 则 m 取 n 值,只输出字符串左端的n 个%-m .ns 同上右补空格f 格式符%f 按 7 位有效数输出,不管输出的数是否有效都有 6 位小数%m.nf 总域宽 m(含小数点) ,n 为小数位数,m 足够大左补否则实际输出%-m.nf 同上 右补e 格式符以指数形式输出实数%e 系统自动给出宽度,13 列,小数 8 位,其中小数位6 位,小数点前一位非零数,指数部分5 位 e+000 形式显示%m.ne %-m.ne m 为总宽, n 小数位数默认值为6 g 格式符输出实数,根据数值的宽度自动选取f 或者 e 格式中输出宽度较短的,且不输出无意义的0 数据输入字符数据的输入函数名输入方式函数原型getchar() 有回显,需按回车stdio.h getche() 有回显,不需回车conio.h getch() 无回显,不需回车conio.h scanf()的使用scanf( “格式控制字符串” ,地址列表) ;地址: & 变量名字两个格式说明之间无其他符号时候,输入数据时以空格、回车或TAB 来分隔数据若在格式符之间有其他字符,必须原样输入格式也可以控制宽度,按自左而右截取,但是不能规定小数位数scanf()没有 %u 格式,整数一般用d 实数用 f 选择结构程序设计if-else 语句if-else 语句用于条件判定,其语法如下所示: if 表达式 语句1 else 语句2 其中else 部分是可选的。 该语句执行时, 先计算表达式的值,如果其值为真(即表达式的值为非0), 则执行语句1;如果其值为假 (即表达式的值为0), 并且该语句包含else 部分, 则执行语句2。建议在有if 语句嵌套的情况下使用花括号。在C 语言中我们会经常用到下列结构: if ( 表达式 ) 语句else if (表达式 ) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 22 页 - - - - - - - - - 语句else if (表达式 ) 语句else if (表达式 ) 语句else 语句这种if 语句序列是编写多路判定最常用的方法。其中的各表达式将被依次求值,一旦某个表达式结果为真,则执行与之相关的语句,并终止整个语句序列的执行。同样,其中各语句既可以是单条语句,也可以是用花括号括住的复合语句。switch 结构switch ( 表达式 ) case 常量表达式 : 语句序列case 常量表达式 : 语句序列default: 语句序列 每一个分支都由一个或多个整数值常量或常量表达式标记。如果某个分支与表达式的值匹配,则从该分支开始执行。 各分支表达式必须互不相同。如果没有哪一分支能匹配表达式,则执行标记为default 的分支。 default 分支是可选的。如果没有default 分支也没有其它分支与表达式的值匹配,则该switch 语句不执行任何动作。各分支及default 分支的排列次序是任意的。注意:在switch 语句中, case 的作用只是一个标号,因此,某个分支中的代码执行完后,程序将进入下一分支继续执行,除非在程序中显式地跳转。跳出switch 语句最常用的方法是使用break 语句与 return 语句。循环结构程序设计while 循环和 for 循环while ( 表达式 ) 语句 在 while 循环语句中,首先求表达式的值。如果其值非0,则执行语句,并再次求该表达式的值。这一循环过程一直进行下去,直到该表达式的值为0 为止,随后继续执行语句后面的部分。for ( 表达式1; 表达式2; 表达式3) 语句 它等价于下列while 语句 : 表达式1; while ( 表达式2) 语句表达式3; 与表达式3 是赋值表达式或函数调用,表达式2 是关系表达式。这3 个组成部分中的任何部分都可以省略,但分号必须保留。如果在for 语句中省略表达式1 与表达式3,它就退化成了while 循环语句。如果省略测试条件,即表达式2,则认为其值永远是真值,因此,下列for 循环语句 : for (;) . 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 22 页 - - - - - - - - - 是一个 无限 循环语句,这种语句需要借助其它手段(如 break 语句或return 语句 )才能终止执行。do-while 循环do-while 循环的语法形式如下: do 语句while ( 表达式 ); 在这一结构中,先执行循环体中的语句部分,然后再求表达式的值。如果表达式的值为真,则再次执行语句,依此类推。当表达式的值变为假,则循环终止。break 语旬与continue 语旬break 语句可用于从for、while 与do-while 等循环中提前退出,就如同从switch 语句中提前退出二样。 break 语句能使程序从switch 语句或最内层循环中立即跳出。continue 语句用于使for、while 和do-while 语句开始下一次循环的执行。在 while 与do-while 语句中,continue 语句的执行意味着立即执行测试部分;在 for 循环中, 则意味着使控制转移到递增循环变量部分。continue 语句只用于循环语句,不用于switch 语句。某个循环包含的switch 语句中的continue 语句,将导致进入下一次循环。goto 语句C 语言提供了可随意滥用的goto 语句以及标记跳转位置的标号。最常见的用法是终止程序在某些深度嵌套的结构中的处理过程,例如一次跳出两层或多层循环。这种情况下使用break 语句是不能达到目的的,它只能从最内层循环退出到上一级的循环。下面是使用goto 语句的一个例子: for ( . ) for ( . ) . if (disaster) goto error; error: /* clean up the mess */ 标号的命名同变量命名的形式相同,标号的后面要紧跟一个冒号。标号可以位于对应的goto 语句所在函数的任何语句的前面。标号的作用域是整个函数。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 22 页 - - - - - - - - - 数组一维数组一维数组的定义类型说明符数组名常量表达式 ;说明:常量表达式是数组长度,不能用变量表示,可用符号常数或常量表达式;数组名与变量名不能重复;允许一个类型下说明多个变量和数组;数组名是数组的首地址,即a=&a0 。一位数组的初始化类型说明符数组名 常量表达式 = 值,值, , ,值;说明:可以只给部分元素赋值;只能对元素逐个赋值,不能对数组整体赋值;对全部元素赋值时,可以不定义数组长度,系统自动根据初值个数来决定数组长度;未赋值时候元素值随机。数组元素的引用数组名 下标表达式 说明:下标表达式可为常量、表达式、变量,取值范围0元素个数 -1,不能越界;只能对数组的元素进行操作。二维数组二维数组的定义类型说明符数组名 常量表达式1 常量表达式2;例如int b33; 在内存中顺序为b00b01b02b10b11b12b20b21b22 说明:元素按行排列;二维数据可以看做一维数组的数组。二维数组的初始化int a23=1,2,3,7,8,9或 int a23=1,2,3,7,8,9 int a 3=1,2,3,7,8,9或 int a 3=1,2,3,7,8,9自动计算行数,但是列数不可以省略。int a23=1,2,5相当于 int a23=1,2,0,5,0,0自动将少的值赋为0. 二维数组的引用数组名 下标 1 下标 2; 说明:俩下标必须放在俩括号内;下标可以是表达式、常量、变量,不能越界。字符数组定义、初始化、引用定义char c10; 、char c510; 初始化char str= ,c? ,?h?,?i?,?n?,? a? 或 char str5= ,c? ,?h? ,?i?,?n?,?a?以字符常量的形式初始化名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 22 页 - - - - - - - - - char str10 = ,c? ,?h?,?i?,?n?,?a? char str= “china” 以字符串形式初始化,相当于char str6= “china” 字符串和字符串结束标志C 中没有字符串变量,所以处理字符串常常用字符数组来实现,字符数组相当于字符串变量。对字符串常量,系统会自动在末尾加0 作为结束标志。对字符数组,有时候加0,有时候不加0,见上初始化。字符数组的输入输出逐个for(i=0;i20;i+) scanf(%c,&stri); for (i=0;i20;i+ )printf( “ %c” ,stri); 说明:若输入的字符数小于循环数,按回车后会继续等待输入,回车、空格均算字符;若输入字符数大于循环数,则取前面的;输入为缓冲读,接受到回车,scanf 才读数据。整个scanf(“ %s” ,&str); printf( “ %s” ,str); 说明:输入时候不能含空格,否则会认为该字符串已经输入完成;自动加结束标志。常用字符串处理函数stdio.h gets(str) 从键盘输入字符串存入str 数组,可含空格,回车结束puts(str)将 str 中字符输出到显示器,直到0,会将 0 转换为 n 输出。string.h strlen(str) 求字符串长度,不包括0,返回长度值strcat(str1,str2)将 str2 字符串连到str1 后面,从str1 的0 处开始。strcpy(str1,str2)str2 复制到 str1 中strcmp (str1,str2)比较俩字符串。相等返回0,1 大返回正数, 2 大返回负数(绝对值都是ASCII码差值)。比较规则:按字符的ASCII 码值大小,知道出现第一个不同的字符,即由第一个不同字符的大小决定所在串的大小。函数函数概述模块化程序设计分而治之;函数本质:独立完成任务,可以调用其它函数,内部工作对外不可见。main 函数开始, main 函数结束, main 函数可以调用其它函数,不可被调用。函数的分类库函数、用户定义函数;有返回值函数(必须定义返回值类型)、无返回值函数(void) ;无参函数、有参函数。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 22 页 - - - - - - - - - 函数的定义及调用函数定义无参函数:类型标识符函数名() 声明部分语句 有参函数:类型标识符函数名(类型名形参 1,类型名形参 2,, ) 声明部分语句 空函数函数名() 用于扩充功能预留。说明:函数不能嵌套定义;形参必须分别定义类型。函数参数传递实参是函数调用时候括号里的参数,参数传递是单向的,由实参到形参;只有被调用时,函数的形参才会分配内存空间,函数完成后释放内存空间;形参的值变化不会影响到实参;实参形参的顺序、数量、类型必须一致;实参可以使变量、常量、表达式,但必须有确定值;形参说明两种方式:int max(x,y)int x,y; int max(int x, int y) 函数的返回值通过 return 函数返回值:return 表达式;或者return ()表达式;return 函数终止函数的执行,返回表达式的值,每个函数只能执行一个return 语句;无 return 语句的函数返回值不确定;返回值应该和函数的定义类型一致,若不一致,强制转换为函数类型。无返回值定义为void,默认是int 型。函数调用和参数传递函数的调用函数名(实参列表);或者函数名();调用方式:printf (” ,” ) ;作为独立语句r=max(a,b)+min(c,d); 作为表达式x=max(max(a,b),min(c,d); 作为函数的参数函数声明与函数原型名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 22 页 - - - - - - - - - 函数必须存在才能被调用,库函数要包含相应的头文件;函数在调用之前要声明,声明格式:类型标识符函数名(类型名形参 1,类型名形参 2,, ) ;形参名字无所谓;声明只是告诉编译系统该函数的一些信息,以便进行语法检查,注意区分与函数定义的区别。下列情况不需声明即可调用:函数定义出现在主调用函数之前;如果在所有函数定义之前、文件的开始、函数的外部已经预先声明了,那不需再声明;库函数不需声明,包含相应的头文件即可。函数的嵌套调用不允许嵌套定义,允许嵌套调用,即函数定义中又调用了别的函数。数组作为函数参数数组元素作函数实参数组元素作为实参,可以看做是普通变量,不要求形参也是下标变量,而且传递的是值,遵循参数单向传递。数组名作为函数参数数组名可以做形参、实参;系统不为形参数组分配地址,实参向形参只是传送地址,这样被调函数可以实现对主调函数数组的操作。例如:float aver(float a) 函数体 void main() float score10,av; av= aver(score); 说明:形参数组和实参数组类型必须一致;长度可不同,形参长度可不定义,只传递首个地址。函数的递归调用函数的递归调用是指一个函数在它的函数体内,直接或间接地调用它自身。直接递归调用:在调用hs 函数过程,又调用hs 函数;间接递归调用:在调用hs1 函数的过程中,调用了hs2 函数,而在调用hs2 函数的过程中又调用了hs1 函数。防止无终止运行,必须有终止递归的条件。递归调用两个阶段:递推阶段:将原问题分解为新的子问题,最终达到已知的条件回归阶段:从已知条件出发,逐一求值回归,最终达到递推的开始处,完成递归调用。变量的作用域及其存储类型局部变量名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 22 页 - - - - - - - - - 局部变量是指在程序块或者函数内定义的变量(内部变量),只能被定义它的程序块或者函数访问,函数或程序块结束执行时,系统收回其内存空间。C 中的局部变量:函数体内定义的变量(包括main 函数) ;复合语句中定义的变量;形参。说明:访问变量有同名时,采用局部有限的原则;不同函数的局部变量名字可相同。全局变量在函数外部定义的变量;也称外部变量。作用域:从定义开始到文件结束。优点:增加函数间数据联系的渠道,从函数得到一个以上的返回值,减少函数实参与形参耳朵个数,减少内存空间以及传递数据时的时间消耗。缺点:不符合模块化程序设计的原则(函数是一个封闭的整体),使得函数的移植性、通用性、可读性降低;各个函数都可能改变全局变量的值,容易出错;长时间占用存储单元。外部变量的声明:在外部变量的定义之前如果需要引用,那就需要声明extern a;声明只是说明有这个外部变量,只有定义外部变量时候才分配内存单元;声明可以出现多次,定义只能出现一次。外部变量与局部变量同名时候,局部变量会屏蔽全局变量(局部优先原则)。定义全局变量时候,若使用static,表示全部变量作用域仅限于该源文件。变量的存储类型静态存储、动态存储两种类型;C 中 4 种存储类型:auto:自动变量;默认都这种;作用域同局部变量。register:寄存器变量,频繁访问的变量可设成此类型;只有局部变量和形参才能设成此,静态存储的不可以;系统会自动将访问频繁的变量放在寄存器中,所以没必要手动设定。extern:外部变量,只能用来声明,不能用来定义以及初始化;可以在同一个程序的其他源文件中声明该源文件定义的外部变量,并且引用(定义为static 的例外)。static:静态变量。全局变量默认初值0 或者空字符;自动变量初值不确定内部函数和外部函数内部函数(静态函数)static 函数类型函数名(参数) , 只能被本文件的函数调用;好处:不容易混淆,与其他文件的函数可以同名。外部函数extern 函数类型函数名(参数), 可以被其他文件调用;默认都是extern 型的函数;调用前应该声明:extern 函数名();编译预处理预处理是文件中#开头的语句,进行编译之前的工作。宏定义:用标识符来代表一个字符串,编译前就将这些标识符替换成所定义的字符串。不带参数的宏定义:#define 标识符字符串将字符串换成宏名的过程宏替换或宏展开;用宏名代替字符串的过程宏调用;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 22 页 - - - - - - - - - 说明:#define 之间没空格,宏名两侧用空格;行末不用分号,加分号将分号也算作字符串一部分;只是简单的替换,不管数据类型,也不分配内存;作用域到文件结束或者“#undef 标识名”命令;宏名可以重复,也可以层层置换;当宏名出现在“” 中,看做是字符串一部分,不进行替换;带参数的宏定义:#define 宏名(参数表)字符串例如: #define S(a,b)a*b 调用时候: area=S(2,3)相当于area=2*3 说明:宏名与括号之间不能有空格,否则认为没参数;简单替换容易出错,建议将字符串内所有参数用括号括起来;参数不用管类型。文件包含:文件包含命令的功能:把指定的文件插入该命令行位置取代该命令行位置,从而把指定的文件和当前的源程序文件练成一个源文件。#include “ 文件名 ”或者 #include 两种格式区别:使用“”,系统先在当前目录查找,没找到在到系统指定的包含文件目录查找;使用 ,直接到系统指定的包含文件目录查找。一般来说使用“”比较保险,不会漏掉当前目录。说明:一条命令只能包含一个文件;常被包含的文件,称为头文件,h 后缀,头文件中可以定义宏、外部变量、结构类型等;文件包含可以嵌套;编译预处理时候,预处理程序将文件复制到包含命令的位置上。条件编译:提高可移植性。三种形式第一种:#ifdef 标识符程序段 1 #else 程序段 2 #endif 第二种:#ifndef 标识符程序段 1 #else 程序段 2 #endif 第一种:#if 常量表达式程序段 1 #else 程序段 2 #endif 注意区分与if,else, 语句的区别,此处是条件编译,不满足条件的就不编译。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 22 页 - - - - - - - - - 指针指针就是内存的地址,内存的地址就是为了方便对内存的管理对内存单元的编号。变量与指针直接访问:直接调用变量名;间接访问就是将变量的地址放在另一个变量中(指针变量)。指针变量的定义类型说明符* 变量名;其中 *代表这是指针变量,类型说明符说明的是指向变量的数据类型。指针变量的引用指针必须先赋值才能调用,不然会引起混乱。例如:char c,*p ;p=&c; 又例如:char c, *p=&c; x=*p; * 和&是一对逆运算;*出现在声明中,是类型说明,出现在执行语句的时候,则为指针运算符,表示指针所指的变量注意:指针的类型说明符号必须和指向变量的一致;相同类型指针之间可以相互赋值;只能将变量的地址赋值给指针,不能讲表达使的地址赋值给指针;不允许把一个整数赋值给指针。指针变量作为函数参数指针变量作为函数参数,同样遵守单向传递的规则,即指针变量的内容(地址)单向传递,但是指针所指向的地址或者变量的内容可以双向传递。例如:Void swap(int *p1,int*p2) Int t; t=*p1;*p1=*p2;*p2=t; 一维数组与指针指向一维数组元素的指针变量的定义与赋值例如: int a10; Int *p; p=&a3; 或者: int a10,*p; p=a; 指向一维数组的指针的相关运算指针变量和整数的算术运算名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 22 页 - - - - - - - - - 假如有: int a10,*p; p=&a5; 则有: p+n 指向 p 所指元素后面第n 个元素; p-n 指向 p 所指元素前面第n 个元素;注意p+/+p以及 p-/-p 的区别;指针之间的减法运算当两个指针指向同一数组时,那么两个指针可以进行减法运算,结果是两个指针指向元素的下标差。指针之间的关系运算例如: int n,m,a10,*p1,*p2; p1=&a2;p2=&a3; 则:p2p1 真p1+=p2 假( p+先使用,后加1)-p2=p1 真p1a 假p2num 指向结构体数组的指针struct student_type class30; struct student_type *p=class; p 指向 class0则 p+1 指向 class1;p 只能指向数组元素,不能指向具体成员;对于地址类型不同,要实现赋值,必须使用强制类型转换p=(struct student *)&class0.num 共用体union data int i; float f; char ch; ; union data a,b,c; 定义、使用和结构体基本一致,本质区别是结构体所占内存空间是所有成员所占内存的总和,而共用体所占内存空间是其成员中所占存储单元最大的值。注意只有一个成员起作用,最后一次存取的成员起作用;所有成员内存地址相同;不能对共用体变量赋值,只能对成员赋值;不能定义共用体变量时进行初始化;共用体变量不能作函数参数,其成员可以。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 22 页 - - - - - - - - - 枚举数据类型定义enum weekday sun,mon,tue,wed,thu,fri,sat; enum weekday workday,weekend; 或者enum weekday sun,mon,tue,wed,thu,fri,sat workday,weekend; 注意:编译时候枚举元素的值默认变为0,1,2 , 如上面 mon=1,sun=0,如果 workday=mon, 则 workday值为 1;可以改变枚举元素值,如 enum weekday sun=7,mon=1,tue,wed,thu,fri,sat以后的元素依次加1,sat 为 6; 枚举值可以进行关系运算;不能对枚举元素直接赋值,只能通过上述定义时改变其值;整数不能赋值给枚举变量,如 workday=2; 错误,因为类型不一致,可以如此: workday=(enum weekday )2; 相当于 workday=tue. 自定义类型定义数组typedef int NUM50; NUM s1,s2; 定义指针typedef char *STRING; STRING p,st6; 定义结构体typedef struct student_type ,STUTP; STUTP stu1,stu2; 注意:自定义类型就是将已有类型增加一个别名,不是创造新的类型;typedef 只能声明类型,不能声明变量,一般大;typedef 在编译时完成,而#define 是预处理, typedef 更加灵活;文件文件概述文件是存储在外部介质上数据的集合。操作系统以文件为单位对数据进行管理。文件的分类:普通文件、设备文件;ASCII 码文件、二进制码文件。在 C 语言中对文件的存取是以字符为单位的,C 语言处理文件的方法是采用“缓冲文件系统”的方式。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 19 页,共 22 页 - - - - - - - - - 文件类型指针文件结构指针是一个指向文件有关信息的指针。声明:FILE *指针变量名;文件的打开与关闭文件操作前要打开,操作完毕之后要关闭。文件的打开:FILE * 文件指针名;文件指针名 = fopen(文件名,使用文件方式);说明:文件指针名必须先定义;文件名必须有效,可带路径(相对、绝对);该函数的返回值是文件首地址。使用文件方式:文件操作方式含义r 只读打开一个文本文件只读w 只写生成一个文本文件只写a 追加对一个文本文件添加rb 打开一个二进制文件只读wb 生成一个二进制文件只写ab 对一个二进制文件添加r + 打开一个文本文件读/写w + 生成一个文本文件读/写a+ 打开或生成一个文本文件读/写rb+ 打开一个二进制文件读/写wb+ 生成一个二进制文件读/写ab+ 打开或生成一个二进制文件读/写说明:r 只能读,且打开的文件必须存在;w 只能写,若不存在文件则新建,若存在则删了重新建;a 方式,指针移动到文件末尾实现追加操作;带+的,可以读、写;带b 的可对二进制文件操作;打开失败fopen 返回一个空指针NULL 文件的关闭:fclose(文件指针);即将指针不再指向文件。关闭成功返回0,出错返回EOF(-1) 要养成使用完文件及时关闭的习惯,防止缓存中的数据丢失。文件的读写文件的字符读写字符变量 =fgetc (文件指针) ;从文件中读取一个字符,同时将位置指针向前移动一个字符。说明:文件必须是读或者读/写方式打开;文件内部位置指针不是文件指针,位置指针不需声明,而是系统自动设置,初始在文件第一个字符,每读取一个字符,向前移动一个位置。fputc (字符数据,文件指针);向文件写入一个字符,同时将位置指针向前移动。说明:文件打开方式可以是写、读写、追加;写或读写会清除原文件内容,追加会在 文 件名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 20 页,共 22 页 - - - - - - - - - 末尾开始写。文件的字符串读写fgets(str,n,文件指针) ;str 是字符型数组名,n 为读取字符个数,即将文件n 个字符读取到str 数组中。错误或者文件尾时返回 NULL 。说明:读取结束条件:已经读了n-1 个字符,因为还有个0 字符自动填入;已到文件末尾;读到回车符,将回车作为一个字符送入str,然后送入 0。fputs(str,文件指针);str 可以使字符数组,也可以是字符串常量。成功返回最后一个字符的ASCII 值,错误返回EOF。向文件写入的时候,会将字符串末尾的0 自动舍去。文件的数据块读写fread( buf, n, count, 文件指针);从文件中每次读n 个字节, 连续 count 次,存到 buf 数组,位置指针前移n*count , 成功返回 count,出错或到尾返回值小于count。fwrite (buf,n,count, 文件指针);将 buf 中数据每次向文