C语言基础知识点总结

发布时间:2018-06-30 16:32:34   来源:文档文库   
字号:

重庆市二级C语言基础知识点总结

第一部分 C语言基础知识

C程序的基本结构

1. 1)一个C程序由一个或者多个函数构成,有且仅有一个主函数main()

2)一个函数由函数的首部和函数体组成。

3)函数是从主函数(main())开始执行,回到主函数(main())结束;(与main()函数在程序中定义的位置无关)

4)一个程序的编译是从第一个函数(语句)开始,到最后一个函数(语句)结束;

5)算法的特性:有穷性,确定性,有一个或者0输入,有一个或者多个输出;有效性

6)算法(程序)的几个结构:选择结构,顺序结构,循环结构

2. 用户标识符,由数字,字母,下划线构成,第一个不能是数字(一般会出选择题让你判断哪个标识符定义正确),字母要区分大小写。不能与32个关键字相同。例:P24 2P1222,模拟题第一题

3. 注释符://注释一行;/**/注释多行,注释不可以嵌套书写。注释没有任何语法功能。

C语言的基本数据类型

1. 数据类型:分为:基本类型(整型,实型,字符型,枚举型),指针类型,构造类型(结构体类型,数组类型,共用体类型),空类型 (空类型合法哦,不要忘记了这个特殊哦)。

基本数据类型


一般只需要记int类型是2个字节,float4个字节,double8个字节

注意int的最大表示范围是-32768――+32767,当超过这个范围的时候,即以%d输出+32768时结果为-32768

长整型(long)表示方法是在数字后面加L,如果一个变量a=3,那么表示的是一个整型的3,如果是a=3L,那么就是长整型的3;当分别以%o%ld%x 8进制,长整型,16进制)输出的时候,结果没有前面的00X,和后面的L

例:int a=075b=ox14;long int c=5L;

printf(“%o%x%ld”a b c); 结果为75145)

P225119

2. 转义字符:\n \t \\ \’ \” \ddd1-3位八进制所代表的字符) \xhh1-2位十六进制所代表的字符) 这个书上习题特别多,P25 19题,P1203题,P13816P14714P1522题等

3. sizeof()strlen()sizeof()测试字符串的存储长度strlen()测试字符串长度只计算遇到的第一个\0前面的字符个数。

strlen(“abc\089”)=3 strlen(“abc\012”)=4

注意这个例题char a[30]=“abc\0b”;

sizeof(a)=30 ; sizeof(“abc\0b”)=6;

strlen(a)=3 strlen(“abc\0b”)=3 ;

4. 运算符和表达式:记忆书上附录里的运算符优先级(一定要记住常用的)

1)算术运算符和算术表达式:注意自增++,自减--,自反-

++--,当++--,在变量后面的时候表示在本次运算的时候会改变,在下次引用或者参与运算的时候才会自变;当++--,在变量的前面的时候则是在本次运算就发生自变(顺便掌握++--结合性是右结合,若i+++j等价于(i++)+j

2)关系运算符><<=>== =!= ==!=优先级最低。

注意===的区别:=是赋值的意思,表达式的值是对变量赋的值,==是关系运算符,关系运算表达式的值为0或者1(关系运算的结果本应是逻辑值,但C语言中没有逻辑数据类型,因此用整型数据来表示关系运算的结果)。

3)逻辑运算符&& ||!在这几个中优先级!大于 && 大于 ||,优先级是体现在结合性上而不是运算的先后性上。例如

a=b=c=1;d=++a||++b&&++c

在这个里面&&最高那就是加粗部分先看成一个整体,运算顺序还是从++a开始,即做完这个运算后,可以依次判断出后边的运算式子没有必要计算了,所以d=1a=2b=1c=1

4)赋值运算符:简单赋值运算符“=”其左边必须是变量一般形式:变量名=表达式

复合赋值运算符:+=-=*=/=%=<<=>>=&=^=|=注意当等号后面接的是表达式的时候要把表达式看成一个整体即x *=y+8等价于x=x*(y+8)y+8是一个整体

5)条件运算符:由两个符号“?”和“:”构成,

一般形式:表达式1?表达式2:表达式3

先计算表达式1的值,如果值为真(非0),则将表达式2的值作为条件表达式的值,否则将表达式3的值作为条件表达式的值。

6)逗号运算符和逗号表达式

一般形式:表达式1,表达式2,……,表达式n

求值时从左至右依次计算,最后计算表达式n的值,并将表达式n的值作为逗号表达式的值。

例:#include

void main()

{ int a;

printf(“%d\n”,(a=3*8,a*4,a+5));

}该程序的输出结果为29,变量a的值为24,注意此处考察了逗号表达式、逗号和赋值符号的优先级。=优先级高于,的优先级。

7)位运算符和位表达式(参考教材P17-18

位运算符有 | (或)即只要有一个1就是1 &(与)要全部为1才为1 ^(异或)要不相同才为1 ;注意的是当向左移动n位就是乘以2n次方;向右移动n位就是除以2n次方。

8)强制类型转换运算符

强制类型转换的一般形式:(类型名)表达式

表达式(double(x+y),是将x+y的值转换为double类型后得到的值,变量x,y和表达式x+y都保持原来的数据类型。

C程序的输出

printf()函数的一般形式为:printf(“格式控制字符串”,输出表列);

格式控制包括两种信息:(1)格式说明:由%和格式字符组成。如%d%f等。作用是将输出的数据转换为指定的格式输出。格式说明总是由%字符开始。(2)普通字符:即需要原样输出的字符。如逗号、空格和换行符。所以在写程序输出结果时,这种字符要原样写出来。

putchar()函数的作用是向终端输出一个字符。一般形式:putchar(c),输出字符变量c的值,c可以是字符型变量或整型变量

%d%md%m.nd, %e,以及相应的几种格式是什么意思

C程序的输入

scanf()函数的一般形式为:scanf(“格式控制字符串”,变量地址);

这里的格式控制与printf()中的一样。变量地址表是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。

getchar()函数的作用是从终端输入一个字符gechar函数没有参数一般形式:getchar()

常用数学类标准库函数的简单应用:

abs()fabs()fmod()sin()cos()tan()exp()pow()log()log10()sqrt()。参考教材

第二部分 C程序的基本控制结构

分支结构

1. if语句与程序的单分支结构

形式:if(表达式)

语句

功能:若表达式的值为真,则执行语句

注意,当函数作为if里面的表达式的时候即if(printf(“*”))的时候,则是以函数的返回值判断if的真假,printf输出以1个字符则返回为1,所以这个if是真的;

2. if……else语句与程序的双分支结构

形式:if(表达式)

语句1

else

语句2

功能:若表达式的值为真,则执行语句1,否则执行语句2

3. 复合语句及其在程序中的使用

复合语句是用一对花括号“{}”将若干条C语句括起来形成的语句序列。复合语句的基本形式如下所示:

{ 语句1;

语句i;

语句n;

}

注意:

C语言的复合语句右括号“}”后不需要用分号“;”结尾,如果在程序中有如下形式的语句格式出现,则应认为是复合语句后面跟了一个空语句:

{ 语句序列;} /* 最后的分号是空语句 */

4. if语句的嵌套与程序的多分支结构

C语法规定else 必须与最近的if相匹配。

5. switch语句与程序的多分支结构

形式:

switch(表达式)

{ case 常量表达式1:语句组1

case 常量表达式2:语句组2

………

case 常量表达式n:语句组n

default:语句组n+1;

}

a) 常量表达式必须为整型、字符型或者枚举型,且值必须互不相同

b) case后可包含多个可执行语句,且不必加{ }

c) 多个case可共用一组执行语句

d) 当表达式的值和某个case后面的语句相匹配时,则执行相应case后面的语句,并继续执行之后的语句。若不希望继续执行之后的语句,则使用break语句跳出switch语句。参考P40,11

循环结构(执行过程参考课件)

1. while型循环

形式: while(表达式)

语句

注意在while()后面没有;号,当函数或者赋值表达式放在while()中时与if的判断方法一样,判断函数的返回值或表达式值的逻辑值;若表达式的值为真(非0),则执行语句(循环体),否则结束循环;

2. do….while型循环

形式do

语句

while(表达式)

先执行语句(循环体)一次,再判断表达式的值是否为真(非0),若为真,则继续循环否则终止循环。同while()型循环相比,while()是先判断条件后执行语句,而do…while则是先执行语句后判断条件,无论如何都会先执行一次。

3. for型循环

形式:for(表达式1;表达式2;表达式3)

例:for(i=1;i<100;i++)

s=s+i;(注意for括号的后面没有;号)

当有两个for语句即嵌套的for循环的时候

for(i=1;i<4;i++)

for(j=0;j<5;j++)

s=s+i ;

这个时候是先做i=1;然后判断i;然后做加粗的部分即是把加粗部分看成一个整体做完之后才会回到i++;所以s=s+i ;这个语句做了20次。

不论是笔试的编程还是上机题,都会考到循环。所以一定要认真复习控制结构这一部分内容。如下面的一段程序,输出结果是什么?我们学习一定要把每一个知识点牢固掌握。书上的练习特别多,大家要学会举一反三。

#include

void main()

{

int a[5]={1,2,3,4,5};

int i,j;

for(i=0;i<5;i++)

{

for(j=i;j<5;j++)

printf("%d ",a[j]);

if(j==5)

for(j=0;j

printf("%d ",a[j]);

printf("\n");

}

}

4. 空语句及其在程序中的使用

所谓的空语句就是说没有执行代码,只有一个语句结束的标志:分号

例如模拟题选择第15

5. 循环的嵌套(只要求到3层)这类题,书上有很多的习题,主要是掌握程序的执行过程。参考课件,书上的习题多做练习

6. 总结ifforwhlie,后面如果没有{}的时候,即是只有一个简单的语句的时候,ifforwhlie的作用效力范围是到与之最近的分号结束;当有{ }的时候即是把{ }看成一个整体,控制范围是整个{ }里面的所有语句。

其他简单控制结构(重点)

1. break(参考课件)

功能:在循环语句和switch语句中,终止并跳出循环体或开关体

break只能终止并跳出最近一层的结构

break不能用于循环语句和switch语句之外的任何其它语句之中

2. continue(参考课件)

功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断

仅用于循环语句中

控制结构应用举例(重点)

1. 累加、累乘、最大公约数、最小公倍数、阶乘、素数等简单问题求解方法

参考书上P36-38

2. 穷举思想及程序实现

3. 迭代思想及程序实现(其中包括:一元高阶方程求根的二分迭代解法)。

第三部分 函数与程序结构

函数的定义与调用

1. 1)定义:(看课件、C语言教材)

无参函数的定义:

[类型标识符或void] 函数名()

{

说明语句;

执行语句;

}

有参函数定义:

[类型标识符或void] 函数名(类型 形参1,类型 形参2

{

说明语句;

执行语句;

}

当主函数里面带参数的形式,main(int argcchar *argv[])argc是表示参数的个数,argv这个数组储存的是具体的参数个数。例,

void main(int argcchar *argv[])

{ char **p ;

while(--argc)

{ *p=argv[argc];

puts(*p);

}

}

若输入为 china Beijing flie 则结果为:flie Beijing

2)声明 经常考填空题,无论是上机还是笔试

3)调用 常考题,容易考填空和写输出结果题,注意在调用的时候,函数名(实参列表)括号里面一定是实参,要特别注意哦,参考书上的习题认真练习。

4)返回值(包括基本类型、空类型)参考课件及相关教材

2. 函数调用时的值参数传递,一定要注意,做这种题,要先弄清楚形参和实参。

1)分清形参和实参的区别:

形参是在定义或声明中,实参是在引用当中;当函数名前有int float char等类型名时是定义或者声明,但是要排除省略类型名的情况;一般引用出现在主函数中,

形参是不确定的值,因此不能为常量,实参是确定的值所以可以为常量

2)当实参是一个变量的时候,实参向形参传递,只是个简单的值传递不会改变实参的值;当是实参是地址传递的时候就要改变

:(1 int sub(int x,int y)

{ int c=x;x=y;y=c;}

void main()

{ int a=3,b=2;sub(a,b);

printf(“%d,%d”,a,b);} 结果是 3,2

2 int sub(int* x,int *y)

{int c=*x;*x=*y;*y=c;}

void main()

{int a=3,b=2;sub(&a,&b);

printf(“%d,%d”,a,b);} 结果是 2,3

书上这类题特别多,认真练习!

注意形参和实参必须赋值兼容,也就是说形参和实参维数必须一样;注意区别voidreturn;(参考教材和课件)

3. 嵌套调用

常考阅读程序题,理解书上P75的图

4. 递归调用 理解概念,会做模拟题选择第18题类似题目

5. 简单问题的递归函数设计(例:阶乘、Fibonacci数列、整型数据的数字拆分处理等)

书上有很多关于数字拆分、阶乘的题目,一定要掌握。

变量的作用域和生存期

1. 作用域(全局变量的定义和使用、局部变量的定义和使用)

要严格区分全局变量和局部变量,分清楚各自的作用范围

2. 生存期(存储类别符externstatic对全局变量的作用;存储类别符autostatic对局部变量的作用)

特别注意staticextern

编译预处理

1. 宏定义预处理命令的概念和简单应用(包括带参和不带参宏定义)

1宏替换的时候只是简单的字符替换,不要加任何东西,宏名中不能包含空格;

例:#define xx(m) m*m

…… int i=5;

i=i+xx(4+5);

结果为 i=5+4+5*4+5=34;

2)宏替换是在预编译的时候进行,所以不占用程序运行时间;宏名是无类型的;

2. 文件包含预处理命令的使用方法;

文件包含命令的一般形式为:

#include “文件名或者#include <文件名>,注意这两种表示形式是有区别的。

第四部分 指针与函数

指针变量的定义和引用

1. 指针变量的定义、初始化赋值和引用;

基本概念参考书上,注意指针变量的初始化和赋值。例int a,*p=&a,这是定义了一个指针变量并进行了初始化,特别注意这个时候的初始化用的是*p=&a,这里面的*代表的是指针类型,而不是取值。例 int a,*p;p=&a,定义完变量之后再引用的话就不要加*了。我们的*有两种含义,一种是定义变量的时候,是我们的指针标志,除了定义之外,我们的*代表取指针变量所指地址中的内容,与&为互逆运算

2. C语言中的地址运算;

& 取变量的地址。单目运算符、优先级为2、右结合性。例:i=5; pi=&i;

*:取指针变量所指地址中的内容,与&为互逆运算。单目运算符、优先级为 2、右结合性

指针变量作函数的参数

1. 函数调用时的地址参数传递;

P9113141516等,这类例题特别多,要特别注意

2. 指针变量与指针指向变量的区别;

1存放变量地址(指针)的变量称为指针变量。

例:int *i_pointer;

则变量i_pointer就是指针变量,它的值是某个整型变量的地址,即i_pointer可指向一个整型变量。到底指向哪一个整型变量,应由i_pointer中赋予的变量地址来决定

2若一个指针或指针变量指向某个变量,可通过该指针访问这个变量,这种访问称为间接访问。如将i的地址(指针)赋给i_pointer,即 i_pointer=&i, i_pointer所指向的变量就是i,用* i_pointer表示,此时与i(直接访问)等价

函数的指针

1. 指向函数的指针变量的定义;

用于存储函数指针的变量称为指向函数的指针变量,定义方法为:

类型说明符 (*指针变量名)(形式参数列表)

例:int (*p)(int,int) 表示定义了一个指针变量p,能够指向的函数特征是由两个整型形式参数,返回值是整型数据

2. 用指向函数的指针变量来调用函数;

调用方法(*p)(实参表)

3. 指向函数的指针变量作函数参数;

P90,11

4. 返回指针值的函数;

P94 1

区别函数指针和指针函数的技巧:

1. 函数指针和指针函数都是偏正短语。函数指针的中心词是指针,保存函数的地址。而指针函数的中心词是函数,是一个返回值是指针的函数。在判断时,按照优先级的结合性来判断:

2. 如:int *p()因为()的优先级高,先与p结合,所以p()是一个函数,函数作为中心词,又因为前有*,所以是一个返回值是指针的函数。

3. int (*p)()因为*先与p结合,所以整体是一个指针,指针是中心词,又因为后面有(),所以是一个函数指针,保存函数的地址。

如执行语句p=&a;

1. &*p的含义是什么?&*两个运算符的优先级别相同,但按自右而左方向结合,因此先进行*p的运算,它就是变量a,再执行&运算。因此,&*p&a相同,即变量a的地址。

2. *&a的含义是什么?先进行&a运算,得a的地址,再进行*运算,即&a所指向的变量,也就是变量a*&a*p的作用是一样的,他们都等价于变量a,即*&aa等价。

3. (*p)++相当于a++。注意括号是必要的,如果没有括号,就成为了*p++,++*为同一优先级别,而结合方向为自右而左,因此它相当于*(p++)。由于++p的右侧,是后加,因此先对p的原值进行*运算,得到a的值,然后使p的值改变,这样p不再指向a了。

第五部分 数组及简单应用

数组

1. 一维数组的输入输出,当数组是int(整型的时候)

一个有n个元素的一维数组:

输入: for(i=0;i

scanf(“%d”&a[i]);

输出: for(i=0;i

printf(“%d”a[i]);注意int类型要以%d的格式

2. 一个有nm列的二维数组:

输入:for(i=0; i(这里i控制行,j控制列)

for(j=0;j

scanf(“%d”,&a[i][j]);

输出for(i=0; i

for(j=0; j

printf(“%d”,a[i][j]);注意在输入的时候才有&符号输出的时候没有

3. 对一个有n个元素的数组的遍历(既是说从第一个成员访问到最后一个成员)有以下两种方式:

(1) for(i=0;i0’;i++)

a[i]; (都是指从a[0]访问到a[n-1]) a[i];

4. char a[10]; while(a[i])while(a[i]!=’\0’)都是表示当a数组不结束的情况下继续循环,一般就是指访问整个数组

5. 自编函数实现求字符串的长度:

int fun(char *a) int fun(char *s)

{ int k; { char *p;

p=s

whlie(a[k]) whlie(*p)

k++; p++;

retrun(k-1); } retrun(p-s); }

6. 维数的判断,当*,[]前面有int charfloat等常见的类型名的时候表示是在定义,一个 * 或者[]表示升一维,当表达式前面没有int charfloat的时候则是在引用(或称为使用)一个*或者[ ]表示降一维;

数组的简单应用(本部分内容参考书上程序)

1. 数组元素值的随机生成法(标准库函数srand. rand. time 的使用方法)

2. 常用排序方法(冒泡排序法和选择排序法)

3. 常用查找法(直接查找法和二分查找法)

第六部分 字符数据、字符串(字符数组)数据及其简单应用

C语言字符串表示方法

1. 字符串(字符数组)的定义和初始化方法;

2. 字符串数据的输入方法(scanf函数和gets函数的使用)

一个字符数组即 char a[10];对这个的输入有两种方式

1for(i=0;i

scanf(“%c”,&a[i]);

2gets(a); scanf(“%s”a)(注意这两种方式的括号里面的只能是一个数组名)

3. 字符串数据的输出方法(printf函数和puts函数的使用)

输出也对应有两种方式:

1 for(i=0;i

printf(“%c” a[i]);

2puts(a);printf(“%s”a); 注意这两种方式的括号里面的只能是一个数组名

字符串的常用处理方法(本部分内容参考书上程序)

1. 字符类别的判断方法和大小写字母的转换方法;

2. 字符串中有效数字字符的统计方法;

3. 字符串的复制方法;

4. 字符串的连接方法;

5. 字符串中字符的查找、插入和删除方法;

6. 字符串中子字符串的查找、插入和删除方法;

特别注意字符串的反转、一个字符串在另一个字符串中出现的次数等问题

7. 常用字符和字符串处理标准库函数

包括:isalpha isdigit isalnum isspace isupper islowertouppertolower strlen strcpystrcat strcmp strchr strstr atoi atoll atof 等。

第七部分 指针与数组

一维数组与指针的关系及简单应用

1. 用指向一维数组的指针变量表示数组元素地址和数组元素值的方法;

1指针变量可指向数组起始位置,即指向a[0],也可指向任意数组元素a[i]

int a[10],*p=a; int a[10],*p=&a[0];(初始化方式)

int a[10],*p=a+3; int a[10],*p=&a[3];(初始化方式)

p指向数组元素的起始位置,则p+i等价于a+i,a[i]的地址;p[i]*(p+i)等价于*(a+i),a[i]

2*(p++)*(++p)作用不同。

p的初值为a,*(p++)等价于a[0]p++ *(++p)等价于p++a[1](*p)++表示p所指向的元素值加1

p当前指向a数组中的第i个元素,则*(p--)相当于a[i--];*(++p)相当于a[++i]; *(--p)相当于a[--i]

2. 一维数组简单应用的指针变量表示和处理方法(常用的排序和查找方法)

参考书上例题和习题

二维数组与指针的关系及简单应用

1. 用指向二维数组的指针变量表示数组元素地址和数组元素值的方法;

注意:int a[3][3]**p=a则, a[0]等价于*p表示的是这个2维数组的第一行或者说是这个2维数组的首元素的地址;a[i]等价与*(p+i)都表示是数组的第i行或者是第i行的首元素的地址;所以要引用这个a数组的元素应该用a[i][j]或者**p

2. 指向若干元素构成数组的指针变量定义方法和简单使用;

指针数组与命令行参数

1. 指针数组的定义、初始化和简单应用;

2. 命令行参数的概念和简单应用;

第八部分 构造类型和文件

结构体数据类型的基本概念

结构体变量的长度是各个成员长度的和;当结构体指针和数组的时候注意分清 . ->的区别;

结构体数据类型的简单应用

1. 用于存储分配的标准库函数(包括:mallocreallocfree)

2. 单链表的概念和创建;

3. 单链表的遍历(结点值的依次输出)方法;

4. 单链表中节点的插入方法;

5. 单链表中节点的删除方法;

共用体数据类型

共用体变量的长度是由成员中的最长的成员决定;

注意书上P1377题。一定要记住书上P1058题的公式,如果x.c[0]=0x39; x.c[1]=0x38;也就是说把后面的赋值写成我们的十六进制形式,一定要把十六进制转换为十进制带入计算。则x.i=x.c[1]*256+x.c[0]=56*256+57=14393

共用体类型与结构体类型的区别;

枚举类型

参考书上P102介绍,P1059

文件

1. C语言中可以认识两种文件存储类型(1)文本文件(2)二进制文件;

2. 文件打开与关闭的概念和方法(fopen函数和fclose函数的使用方法)

if((fp=fopen(“文件名”r”))==NULL);当等于NULL的时候就不能打开;注意文件打开之后必须关闭,即是fclose(fp);这两个必然是成对出现;

3. 文件内部记录指针(读写指针)的概念和文件尾的判别方法(EOFfeof函数的使用)

文件在什么情况下结束

1fp==EOF的时候结束fp!=EOF的时候不结束。

2)当feof(fp)返回值为0时不结束,返回非零时就是结束;

4. 文件中单个字符的读写操作(fgetc函数和fputc函数的使用)

5. 文件中字符串读写操作(fgets函数和fputs函数的使用)

6. 文件中的格式化读写操作(fscanf函数和fprintf函数的使用)

7. 文件中数据块读写操作(fread函数和fwrite函数的使用)

8. 文件内部记录指针(读写指针)的移动和定位(fseek函数和ftell函数的使用)

4-8了解各函数的功能即可

wra分别表示对文本文件的读,写,追加;fputs(chfp)指将ch变量输出到文件fp中;ch=fgets(fp)指的是从文件中得到一个字符赋给变量chfreadfwrite(buffersizenumfp)中,buffer指的是文件读出/写入的数据的地址,是一个数组名或者指针;size,指读出或者写入每个数的字节数;num指读出和写入多少个数;fp指文件指针。

文件的简单应用

1. 文件的随机读写(文件处理标准函数的综合应用)

2. 文件内容按制定要求进行合并的方法;

3. 文件内容拷贝的处理方法;

4. 文件内容比较的处理方法;

本文来源:https://www.2haoxitong.net/k/doc/c8601a1a7e21af45b307a89c.html

《C语言基础知识点总结.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式