C语言基础知识点总结Word文档格式.docx
《C语言基础知识点总结Word文档格式.docx》由会员分享,可在线阅读,更多相关《C语言基础知识点总结Word文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
注意int的最大表示范围是-32768――+32767,当超过这个范围的时候,即以%d输出+32768时结果为-32768
长整型(long)表示方法是在数字后面加L,如果一个变量a=3,那么表示的是一个整型的3,如果是a=3L,那么就是长整型的3;
当分别以%o,%ld,%x(8进制,长整型,16进制)输出的时候,结果没有前面的0,0X,和后面的L
例:
inta=075,b=ox14;
longintc=5L;
printf(“%o,%x,%ld”,abc);
结果为(75,14,5)
P22第5、11、9题等
2.转义字符:
\n\t\\\’\”\ddd(1-3位八进制所代表的字符)\xhh(1-2位十六进制所代表的字符)这个书上习题特别多,P25第19题,P120第3题,P138第16题P147第14题P152第2题等
3.sizeof()和strlen():
sizeof()测试字符串的存储长度;
strlen()测试字符串长度,只计算遇到的第一个\0前面的字符个数。
strlen(“abc\089”)=3strlen(“abc\012”)=4
注意这个例题:
chara[30]=“abc\0b”;
sizeof(a)=30;
sizeof(“abc\0b”)=6;
strlen(a)=3strlen(“abc\0b”)=3;
4.运算符和表达式:
记忆书上附录里的运算符优先级(一定要记住常用的)
(1)算术运算符和算术表达式:
注意自增++,自减--,自反-,
++,--,当++,--,在变量后面的时候表示在本次运算的时候不会改变,在下次引用或者参与运算的时候才会自变;
当++,--,在变量的前面的时候则是在本次运算就会发生自变(顺便掌握++,--结合性是右结合,若i+++j等价于(i++)+j;
(2)关系运算符:
>
,<
=,>
=,==,!
=,==和!
=优先级最低。
注意=与==的区别:
=是赋值的意思,表达式的值是对变量赋的值,==是关系运算符,关系运算表达式的值为0或者1(关系运算的结果本应是逻辑值,但C语言中没有逻辑数据类型,因此用整型数据来表示关系运算的结果)。
(3)逻辑运算符:
&
,||,!
在这几个中优先级!
大于&
大于||,优先级是体现在结合性上而不是运算的先后性上。
例如
a=b=c=1;
d=++a||++b&
++c
在这个里面&
最高那就是加粗部分先看成一个整体,运算顺序还是从++a开始,即做完这个运算后,可以依次判断出后边的运算式子没有必要计算了,所以d=1,a=2,b=1,c=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<
stdio.h>
voidmain()
{inta;
printf(“%d\n”,(a=3*8,a*4,a+5));
}该程序的输出结果为29,变量a的值为24,注意此处考察了逗号表达式、逗号和赋值符号的优先级。
=优先级高于,的优先级。
(7)位运算符和位表达式(参考教材P17-18)
位运算符有|(或)即只要有一个1就是1,&
(与)要全部为1才为1^(异或)要不相同才为1;
注意的是当向左移动n位就是乘以2的n次方;
向右移动n位就是除以2的n次方。
(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语句与程序的双分支结构
语句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循环的时候
4;
for(j=0;
j<
5;
j++)
s=s+i;
这个时候是先做i=1;
然后判断i;
然后做加粗的部分,即是把加粗部分看成一个整体做完之后才会回到i++;
所以s=s+i;
这个语句做了20次。
不论是笔试的编程还是上机题,都会考到循环。
所以一定要认真复习控制结构这一部分内容。
如下面的一段程序,输出结果是什么?
我们学习一定要把每一个知识点牢固掌握。
书上的练习特别多,大家要学会举一反三。
{
inta[5]={1,2,3,4,5};
inti,j;
for(i=0;
i++)
{
for(j=i;
j++)
printf("
%d"
a[j]);
if(j==5)
for(j=0;
i;
printf("
\n"
);
}
4.空语句及其在程序中的使用
所谓的空语句就是说没有执行代码,只有一个语句结束的标志:
分号
例如模拟题选择第15题
5.循环的嵌套(只要求到3层)这类题,书上有很多的习题,主要是掌握程序的执行过程。
参考课件,书上的习题多做练习
6.总结if,for,whlie,后面如果没有{}的时候,即是只有一个简单的语句的时候,if,for,whlie的作用效力范围是到与之最近的分号结束;
当有{}的时候即是把{}看成一个整体,控制范围是整个{}里面的所有语句。
其他简单控制结构(重点)
1.break(参考课件)
在循环语句和switch语句中,终止并跳出循环体或开关体
break只能终止并跳出最近一层的结构
break不能用于循环语句和switch语句之外的任何其它语句之中
2.continue(参考课件)
结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断
仅用于循环语句中
控制结构应用举例(重点)
1.累加、累乘、最大公约数、最小公倍数、阶乘、素数等简单问题求解方法
参考书上P36-38
2.穷举思想及程序实现
3.迭代思想及程序实现(其中包括:
一元高阶方程求根的二分迭代解法)。
第三部分函数与程序结构
函数的定义与调用
1.
(1)定义:
(看课件、C语言教材)
无参函数的定义:
[类型标识符或void]函数名()
说明语句;
执行语句;
有参函数定义:
[类型标识符或void]函数名(类型形参1,类型形参2,…)
当主函数里面带参数的形式,main(intargc,char*argv[])中argc是表示参数的个数,argv这个数组储存的是具体的参数个数。
例,
voidmain(intargc,char*argv[])
{char**p;
while(--argc)
{*p=argv[argc];
puts(*p);
}
若输入为chinaBeijingflie则结果为:
flieBeijing;
(2)声明经常考填空题,无论是上机还是笔试
(3)调用常考题,容易考填空和写输出结果题,注意在调用的时候,函数名(实参列表)括号里面一定是实参,要特别注意哦,参考书上的习题认真练习。
(4)返回值(包括基本类型、空类型)参考课件及相关教材
2.函数调用时的值参数传递,一定要注意,做这种题,要先弄清楚形参和实参。
(1)分清形参和实参的区别:
✧形参是在定义或声明中,实参是在引用当中;
当函数名前有int,float,char等类型名时是定义或者声明,但是要排除省略类型名的情况;
一般引用出现在主函数中,
✧形参是不确定的值,因此不能为常量,实参是确定的值所以可以为常量。
(2)当实参是一个变量的时候,实参向形参传递值,只是个简单的值传递,不会改变实参的值;
当是实参是地址传递的时候就要改变
(1)intsub(intx,inty)
{intc=x;
x=y;
y=c;
voidmain()
{inta=3,b=2;
sub(a,b);
printf(“%d,%d”,a,b);
}结果是3,2
(2)intsub(int*x,int*y)
{intc=*x;
*x=*y;
*y=c;
{inta=3,b=2;
sub(&
a,&
b);
}结果是2,3
书上这类题特别多,认真练习!
注意形参和实参必须赋值兼容,也就是说形参和实参维数必须一样;
注意区别void和return;
(参考教材和课件)
3.嵌套调用
常考阅读程序题,理解书上P75的图
4.递归调用理解概念,会做模拟题选择第18题类似题目
5.简单问题的递归函数设计(例:
阶乘、Fibonacci数列、整型数据的数字拆分处理等)
书上有很多关于数字拆分、阶乘的题目,一定要掌握。
变量的作用域和生存期
1.作用域(全局变量的定义和使用、局部变量的定义和使用)
要严格区分全局变量和局部变量,分清楚各自的作用范围
2.生存期(存储类别符extern和static对全局变量的作用;
存储类别符auto和static对局部变量的作用)
特别注意static和extern
编译预处理
1.宏定义预处理命令的概念和简单应用(包括带参和不带参宏定义);
(1)宏替换的时候只是简单的字符替换,不要加任何东西,宏名中不能包含空格;
#definexx(m)m*m
……inti=5;
i=i+xx(4+5);
结果为i=5+4+5*4+5=34;
(2)宏替换是在预编译的时候进行,所以不占用程序运行时间;
宏名是无类型的;
2.文件包含预处理命令的使用方法;
文件包含命令的一般形式为:
#include“文件名”或者#include<
文件名>
,注意这两种表示形式是有区别的。
第四部分指针与函数
指针变量的定义和引用
1.指针变量的定义、初始化、赋值和引用;
基本概念参考书上,注意指针变量的初始化和赋值。
例inta,*p=&
a,这是定义了一个指针变量并进行了初始化,特别注意这个时候的初始化用的是*p=&
a,这里面的*代表的是指针类型,而不是取值。
例inta,*p;
p=&
a,定义完变量之后再引用的话就不要加*了。
我们的*有两种含义,一种是定义变量的时候,是我们的指针标志,除了定义之外,我们的*代表取指针变量所指地址中的内容,与&
为互逆运算。
2.C语言中的地址运算;
:
取变量的地址。
单目运算符、优先级为2、右结合性。
i=5;
pi=&
*:
取指针变量所指地址中的内容,与&
单目运算符、优先级为2、右结合性
指针变量作函数的参数
1.函数调用时的地址参数传递;
P91第13、14、15、16等,这类例题特别多,要特别注意
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,即*&
a与a等价。
3.(*p)++相当于a++。
注意括号是必要的,如果没有括号,就成为了*p++,而++和*为同一优先级别,而结合方向为自右而左,因此它相当于*(p++)。
由于++在p的右侧,是“后加”,因此先对p的原值进行*运算,得到a的值,然后使p的值改变,这样p不再指向a了。
第五部分数组及简单应用
数组
1.一维数组的输入输出,当数组是int(整型的时候)
一个有n个元素的一维数组:
输入:
n;
scanf(“%d”,&
a[i]);
输出:
printf(“%d”,a[i]);
注意int类型要以%d的格式
2.一个有n行m列的二维数组:
for(i=0;
i<
i++)(这里i控制行,j控制列)
for(j=0;
m;
scanf(“%d”,&
a[i][j]);
i++)
for(j=0;
j<
j++)
printf(“%d”,a[i][j]);
(注意在输入的时候才有&
符号,输出的时候没有)
3.对一个有n个元素的数组的遍历(既是说从第一个成员访问到最后一个成员)有以下两种方式:
(1)for(i=0;
i++)
(2)for(i=0;
a[i]!
=’\0’;
a[i];
(都是指从a[0]访问到a[n-1])a[i];
4.chara[10];
while(a[i])和while(a[i]!
=’\0’)都是表示当a数组不结束的情况下继续循环,一般就是指访问整个数组
5.自编函数实现求字符串的长度:
intfun(char*a)intfun(char*s)
{intk;
{char*p;
p=s
whlie(a[k])whlie(*p)
k++;
p++;
retrun(k-1);
}retrun(p-s);
}
6.维数的判断,当*,[]前面有int,char,float等常见的类型名的时候表示是在定义,一个*或者[]表示升一维,当表达式前面没有int,char,float的时候则是在引用(或称为使用)一个*或者[]表示降一维;
数组的简单应用(本部分内容参考书上程序)
1.数组元素值的随机生成法(标准库函数srand.rand.和time的使用方法);
2.常用排序方法(冒泡排序法和选择排序法);
3.常用查找法(直接查找法和二分查找法);
第六部分字符数据、字符串(字符数组)数据及其简单应用
C语言字符串表示方法
1.字符串(字符数组)的定义和初始化方法;
2.字符串数据的输入方法(scanf函数和gets函数的使用);
一个字符数组即chara[10];
对这个的输入有两种方式
scanf(“%c”,&
(2)gets(a);
scanf(“%s”,a)(注意这两种方式的括号里面的只能是一个数组名)
3.字符串数据的输出方法(printf函数和puts函数的使用);
输出也对应有两种方式:
(1)for(i=0;
printf(“%c”,a[i]);
(2)puts(a);
printf(“%s”,a);
(注意这两种方式的括号里面的只能是一个数组名);
字符串的常用处理方法(本部分内容参考书上程序)
1.字符类别的判断方法和大小写字母的转换方法;
2.字符串中有效数字字符的统计方法;
3.字符串的复制方法;
4.字符串的连接方法;
5.字符串中字符的查找、插入和删除方法;