电子科技大学C语言复试重要知识点总结

C语言重要知识点总结

(基于往年真题突出重难点) 需要PDF的欢迎加我微信:w14145167

第一篇 字符串

字符数组

定义并且初始化字符数组有两种方法:

  1. 用字符给字符数组赋初值
  2. 用字符串常量给字符数组赋初值

char word2[5]=”tree”;

注意:此种方法会在最后自动默认加一个终止符’\0’。如果在定义的时候字符数组的最大字符数比初始化的字符个数大,则在内存中自动为多余的元素赋值’\0’

 更一般的赋值方法:

char word4[]=’tree’;//适合于字符串长度不可知,以免出错。

输出方法:

printf(“%s\n”,word);//这种输入方法是以’\0’来识别结束标志。

字符数组的两种输入方式:

  1. scanf(“%s”,word);//以第一个空白字符(空格、制表符或换行符)为止,同时系统自动在最后加上一个’\0’结束标志;
  2. gets(数组名);//以换行符表示结束
  3. 或者通过循环方法:scanf(“%c”,&word[i]);

注意:在输入字符串前,必须先定义字符数组,且字符数组的长度必须大于要输入的字符串的长度,否则会出现字符数组越界,在运行时出现不可预知的错误,而编译系统则不会报告。

scanf和gets()两种输入字符串的方法的区别:

用scanf函数读取的字符串是不包含空白字符的,因为它会忽略开始的空白字符,以后在读取到空白字符的时候,就会结束读取。而gets函数所读取的字符串则可以包含空格(因为gets是以换行符表示输入结束)。

字符数组的两种输出方法(均必须以’\0’结束):

  1. printf(“%s”,word);//输出时,第一次遇到’\0’就停止输出,所以以此方法输出必须有’\0’结束,没有的话就不能用此方法输出。
  2. puts(字符数组名);//将字符串输出到终端,并且在输出时将字符串结束标记’\0’转换为’\n’。

字符串处理函数(必须引用#include<string.h>)

  1. 字符串长度测量函数strlen(计算不包括’\0’)。
  2. 字符串复制函数strcpy,strcpy(字符数组名1,字符串2),将字符串2拷贝到1里面。一直拷贝到结束标志,并且结束标志’\0’也要拷贝进去。

注意:错误复制方法:word1=word2,因为数组名代表数组地址,而数组地址是不能够修改的。

更多地,strncpy(str1,”Chengdu”,3);//将Chengdu的前三个字符复制到str1。

  1. 字符串连接函数strcat,strcat(字符数组1,字符串2);//取消字符数组的结束标志,然后两者联系起来。
  2. 字符串大小比较函数strcmp(字符串1,字符串2);//比较结果是每位第一个不同的字符的大小关系。

第二篇 指针

指向字符串常量的指针:

指针字符串常量总结:

    • 可灵活修改字符串常量的内容。
    • 字符串常量默认在最后加一个结束标志’\0’。
    • 能够用%s+指针名输出这个字符串
    • 不可以用指针名[i],如p[3]访问字符串常量中的字符,同样也就不能够使用此方法修改里面的字符。只能通过移动指针的方式访问里面的单个字符。即*指针变量名。
    • 输出指针变量就是就是输出指针变量当前指向的整个字符串,输出“*指针变量”就是输出指针变量当前指向的单个字符。
    • 注意:将单个字符作为char *字符串处理,会出错,如下是错误的。

main(){

char *p='a';

printf("%s",p);

}

指针数组

指针数组中的每一个元素都是一个指针变量的数组,与普通数组一样,必须先定义再使用。

定义方法:

形如:int *pd[5];

其中的每一个元素都可存放一个指向整型数的指针。

特点:

  • 其中只能存放地址,不能直接存放数据。
  • 存放地址:pd[2]=&value; 取出指针指向的数据:i=*pd[2];//等效于i=value;

通常可有2种方法处理多个字符串:

  • 通过定义二维数组。
  • 使用字符型的指针数组。

例如:char *status[]={

“write error”;

“read error”;

};

访问其中的字符串:status[1],不用加*号。

访问某一个字符串中的单个字符:*(status[1]+2),表示访问”read error”的第三个字符,表示在status[1]代表的地址的基础上向后跳2个单元(这个单元取决于类型,在C语言中很多这种,这里的类型是char,也就是向后跳一个字节(即8位))。要加*号。

注意:在指针中,编译程序规定,用%s输出指针,是指输出指针指向的整个字符串,用%c输出指针指向的目标变量,是指输出指针当前所指向的一个字符。(这条规则是指针范围内通用,不仅仅在这里)。

第三篇 运算符优先级

优先级的先后顺序记忆:

鸡蛋算一关 卫罗挑胡豆

鸡(基本)蛋(单目)算(算术)一(移位)关(关系)

卫(位逻辑)罗(逻辑)挑(条件)胡(赋值)豆(逗号运算)

再记住:

(* / %) > (+ -)  (< <= > >=) > (== !=) 以及位运算中&>^>|,逻辑中&&>||

单挑赋是从右往左,其余都是从右往左。

第四篇 输入、输出与文件管理

组成C语言输入输出系统的函数可以分为三种类型:控制台I/O、缓冲型文件用于I/O和非缓冲型文件I/O。

控制台I/O操作函数完成标准输入标准输出处理。

值得注意的是,由于C语言中,整型和字符型能够相互转换,虽然很多时候ch被说明为字符型常量(char ch=getchar()),但是getchar()实际返回的是一个整数(由函数的原型定义多确定),因此在大多应用中,通常也可以把getchar()返回值赋予一个整型变量。

getchar()是从标准键盘获得一个输入数。

putchar()是将单个字符变量输出在标准输出设备显示屏上。注意:如果putchar()函数的实参是整数,将把ASCLL值与该整数相对应的字符输出在显示屏上。

字符串输入输出—gets、puts

gets函数用来从键盘读入一个字符串,输入时,以回车结束,但是回车不会不会放入输入字符串中,而编译系统自动在字符串尾加上空字符NULL。

例如:gets(message);

puts()输出用于输出一个字符串,自动在最后加上一个换行符。

文件:

FILE类型包含在stdio.h中。

    1. 打开文件

FILE *fp;

fp=fopen(filename,mode);

如果打开文件失败,将返回一个NULL。

当要同时读写一个文件时,可以使用“r+”,“w+”,“a+”三个选项来扩充项的功能。

注意:a+是从当前位置开始往文件里添加内容。而且可以同时读写文件。

在上述打开方式的基础上,附加“t”或者“b”字符。则可按照文本方式或者按照二进制方式打开。若没有指定,默认为文本方式。

常用的判断打开文件是否成功的代码:

if(fp=fopen(myfilename,”r”))==NULL)

{

printf(“Can’t open %s\n”,myfilename);

exit();
}

    1. 关闭文件函数fclose()

int fclose(FILE *fp);

    1. 单字符输入输出

int getc(FILE *fp);

int putc(int ch, FILE *fp);

fp指针告诉这两个函数应该从哪一个磁盘文件去读字符或者写入字符。虽然putc函数里面把ch定义为整型,但是只使用整型数(用两个字节表示)的低位字节表示字符(字符只占一个字节)。

如果putc函数操作成功,则返回写入文件的字符ASCLL码,如果出现错误,就返回EOF。其值定义为-1。

当getc函数读到文件结束时,该函数返回一个EOF标记。

While(c=getc(fp)!=EOF){ //或者写为while(!feof(getc(fp))){}//feof函数也可以判定是//否到一个文件的末尾了。

 //表示只要没有读取到文件的末尾,就以标准输出的方式输出该字符
putc(c,stdout);

}

    1. 行输入、输出—fgets()、fputs()

char *fgets(char *str, int length,FILE *fp);

char *fputs(char *str, FILE *fp);

fgets是从fp指向的文件读出字符串。一直读取到换行符或者第(length-1)个字符为止,如果读入换行符,它将作为字符串的一部分,且以空字符NULL结束。如果读取成功,函数返回一个指向所读字符串的指针,否则返回一个空指针。

注意:

  1. 注意与gets(),puts相互区别,这两个是从命令行输入或者输出。
  2. 注意与putc与putc两个相互区别,虽然,均是用于文件的输入,输出,但是这个只能向文件输入单个字符,或者输出单个字符。而fgets和fputs是输入,或者输出一个字符串。
  3. 成功返回0,否则返回非零值。

例如:

while(fgets(line, size, fp))

printf(“%3d:%s”,++row,line);

表示从fp所指向的开始,一直读取到换行符,如果此行的字符数多于size-1,那么也最多读取size-1个字符。然后每一行输出格式位:行号:这行的内容。

    1. 数据块的输入输出

int fread(void *buffer, int size, int n, FILE *fp)

int fwrite(void *buffer, int size, int n, FILE *fp)

其中buffer是一个指向存放数据块多的存储区的指针。n表示字段数,size表示每个字段多少字节内容。

要注意的是:fwrite()函数把数组写入文件是以二进制形式存放的,而不是ASCLL码形式,在读出时,使用printf()进行输出才能够在显示屏上得到数组的内容。且这两个函数读写数据均是以字节为单位进行的。

例如:

fwrite((char *)buffer, 2, 10, fp);//表示将buffer中的内容转换为字符之后分成10个字段,每个字段两个字节,放入fp指针指向的文件中。

fread((char *)buffer, 2, 10, fp);//表示从fp指针指向的文件中按照2个字节,读取成10个字段,然后以字符形式放入buffer(缓冲区)中。

    1. 流式文件数据的格式化输入输出—fprintf()、fscanf()

调用方式为:

fprintf(fp, “控制字符串”, 参数表);

fscanf(fp,”控制字符串”, 参量表);

fscanf()函数从fp指向的流式文件中读取格式化(格式化是在控制字符串中定义)数据。

第五篇 基本数据类型及运算

1、整型

整型分:普通整型(int)、短整型(short int或者short)、长整型(long int或者long)。

符号分:整型数可以带符号,也可以不带符号。无符号用unsigned表示,有符号用signed表示,实际上signed完全可以不用写。默认为有符号。

长度:必须long>=int>=short。

在Turbo系统中,一个int型和一个short型分别占据2个字节。一个long型占4个字节。

在Visual C++6.0中,一个short型数据占据2个字节的内存空间,而一个int型数据和long型数据分别占据4个字节的内存空间。

在Turbo型系统中,int类型数据最大可表示32767,最小-32768(记住在编程题中设置max或者min的初值的时候常用)。

一个小技巧:

假设一个无符号类型(int,long,short等等)的表示范围区间是:;

而有符号的表示范围是:);

其中k为这种类型的总位数。

注意:unsigned int与unsigned等价。short int与short等价,等等。

2、浮点型

字符型分单精度型,双精度型,长双精度型浮点数三类。

其中,float占据4字节,double占据8个字节,long double型数据占据16个字节的空间。

注意:浮点型数据的取值范围和值的精度与所用的机器有关。

3、字符型

char:在所有的编译系统中均为1个字节,

4、常量

数值在计算机中一般是采用补码表示的,最左边的一位是符号位,0表示正,1表示负。

一个整数常量后面加上一个u表示该整常量是unsigned int型。如:879u

5、浮点型常量

有两种表示方法;

  • 十进制数形式
  • 指数形式:如34e-6,e之前必须有数字,且e后面的指数必须为整数。

规范化的指数形式:小数点前面只有一个数字且这个数字必须为非0值。如:3.5478e2

如果在浮点数后面不带后缀,就是双精度浮点数,如果带F或f则是单精度浮点数,称为浮点型,如果在浮点型常量后面带后缀L或l,它就是长双精度(long double)

  1. 字符型常量

字符型数据在存储的时候,并不把该字符本身放到内存单元中,而是把该字符的相ASCLL码值放到该存储单元中。

一个字符型数据既可以以字符形式输出,也可以按照整数形式输出,以字符形式输出时,先将存储单元中的ASCLL码转换为相应字符再输出,以整型数据输出时,直接输出其ASCLL码。也可以对字符型数据进行算术运算,相当于是对ASCLL码进行。

  1. 字符串常量

C编译系统在存储字符串常量的时候自动在其末尾加一个’\0’作为字符串结束标志。

注意’a’和”a”不同,一个是字符,一个是字符串。

在内存中的存放方式也不同,”a”的存放会在末尾加一个’\0’。而’a’不会加。

那么,字符串变量呢?

对于字符串变量,没有专门的数据结构,只能通过定义字符数组来存放。

  1. 符号常量

定义符号常量的量两种方式:

    • #define PI 3.14
    • const类型定义符方式定义:如:const float PI 3.14或者把const放在float后面均可。

重点:用这种方式定义的符号常量的值是不能够改变的,任何改变此常量的代码都会产生编译错误。符号常量的值通常用大写字母表示。

变量部分

变量的定义是不能够同不同类型重复定义的,这是不允许的,因为造成了歧义。编译的时候会给出出错信息。

算术运算符和算术表达式:
要注意:

  • 两个整数相除,结果仍然为整数,商向下取整,实际上是整除运算。但是如果除数或者被除数中有一个负值的时候,则舍入的方向不固定。多数机器采用“向零取整”,取整后向0靠拢。(注意-1比-2更靠拢一些)。
  • 如果参加+-*/的数中,有一个数是浮点数,则结果是double型。因为自动转换之后所有的数按照double处理。
  • 取模运算%,左右两边都必须是整数,结果的运算符和%左边的操作数的符号相同。如:45%-8的结果是5,而不是-5。
  • 减法运算符还可以作取负运算。

C语言规定了各种运算符的结合方向(结合性:是指同一优先级运算符的运算先后顺序)注意:对于++或—是不能进行自加/自减。

  • 在调用函数时,多数系统对函数参数的求值顺序是自右向左。

赋值运算符和赋值表达式:

  • 赋值表达式的值等于赋值运算符右边表达式的值,而结果的类型由赋值运算符左边变量的类型决定。如果赋值运算符右边值的类型与左边变量的类型不一致,需要把右边值的类型转换成左边变量的类型。
  • 将赋值表达式作为表达式的一种,使赋值操作不仅可以出现在赋值语句中,而且能以表达式的形式出现在其他语句中(如:输出语句、循环语句)中,例如:

printf(“%d”,i=j);

不要以为是输出i等于j的结果1或者0,然后输出。

正确理解应该是,先将j的值赋给i,然后把i的值输出来,假设j的值等于68,则先将j的值赋予给i,然后,将i的值输出来。为啥这样呢?

首先因为你这里是i=j,而不是i==j,所以不可能结果判定的结果,其次,printf是一个函数,函数里面的参数是自右向左计算,其次i=j是赋值运算,也是自右向左。所以先执行i=j,所以i的值为68,然后以第一个参数的格式输出来。

C语言采用和赋值运算符的作用:

  1. 为了简化程序,使程序精炼
  2. 为了提高编译效率

在一个逻辑表达式中如果包含多个逻辑运算符。应按这三个逻辑运算符的优先级和结合性进行运算。这三个逻辑运算符的优先级是:!的优先级高于&&的优先级,&&的优先级又高于||的优先级;运算是自左至右的顺序进行,也就是其结合性是左结合性。

短路求值:

就是在逻辑表达式中,只要结果已经出来,就不继续计算后面的了。

什么是闰年?

闰年的满足条件是:能被4整除而不能被100整除,或者能被400整除。

代码:(year%4==0&&year%100!=0)||year%100==0;

如果上述表达式值为真,则year为闰年,否则为非闰年。

现代计算机一般采用补码形式存放数,因为采用补码形式不仅数值表示唯一,而且能将符号位与其他位统一处理。实际上采用补码,在计算机中能够将减法变为加法,为硬件实现提供方便。

位逻辑运算符

逻辑运算符没有“进位”,“借位”。

如果两个长度不同的i和j进行按位运算,如:i为long, j为int型号,会自动按照右边对齐,如果j位有符号数,若为正数,左边空缺补0,否则补1。如果j是无符号数,那么左侧也补0。

位逻辑表达式中运算分量都应该是整型量或者字符型量,不允许是浮点型量。

位逻辑运算符和逻辑运算符的区别:

  • 位逻辑运算符是针对二进制位的,而逻辑运算符是针对整个表达式的;位逻辑运算符要计算表达式的具体数值,而逻辑运算符只判断表达式的真与假。
  • 位逻辑运算符&、|和^的两个运算分量是可以交换的,而逻辑运算符&&和||的两个运算分量是不可以交换的,并且它们严格执行自左至右的运算。
  • 位逻辑运算符通常用于与硬件相关的程序中,如设备驱动程序,对表示状态字中的某些位进行测试、设置和屏蔽。

移位运算符和移位表达式

在左移中。m=m<<3,也就是把m的各二进制位全部向左移3位,右边空出的位补0,而左边溢出的位被丢弃不管。

而在右移中,要注意符号位问题,如果移动对象是无符号数,那么右移时左边空出来的位全以0填充,这种方式称为逻辑右移方式;如果移位对象是有符号数,当移位对象是正数(符号位为0时)左边空位用0填充;当移位对象是负数(符号位为1)时,左边空位是补0还是补1,要取决于所用的计算机系统。有时系统按逻辑右移处理,有时则按算术右移方式(即补1)处理。

逗号表达式

形式一般为:表达式1,表达式2。

整个逗号表达式的值为表达式的值,但是没有赋值给任何变量。

逗号表达式是自左到右计算

注意:逗号有两种功能:1.分隔符2.逗号运算符。

printf(“%d,%d,%d”,(a,b,c),b,c);

注意在(a,b,c)中的逗号是逗号运算符,而之后的逗号是分隔符。

混合运算与类型转换

  1. 自动类型转换

自动转换规则图见p63,转换的原则就是往精度高的方向转换,即往能提供的存储空间更大的方向转换。

另外float类型在运算的时候会自动转换为double类型参与运算。short和char类型再计算的时候也会自动转换为int才能参与运算。

另外注意:自动类型转换的时候,只能针对两个运算对象做转换,不能对表达式的所有运算符做一次性的自动转换。

  1. 强制类型转换
  2. 赋值运算中的类型转换
    1. 如果赋值运算符两侧的数据类型一致,则不需要进行数据类型的转换。
    2. 如果赋值运算符两侧的数据类型不一致,则需要将赋值运算符右边的值的类型转换的与左边的类型一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值