C语言考试常见知识点总结

学习C语言的准备知识

3)计算机的数据在电脑中保存是以二进制的形式存入,数据存放的位置就是它的地址。 4)bit位是指为0或者1。 byte是指字节, 一个字节等于八个位。 5)一定要记住二进制如何划成十进制。

程序的结构

1)程序结构有三种: 顺序结构、循环结构(三个循环结构语句)、选择结构(if和switch语句)

2)程序都要从main()入口, 然后从第一条语句顺序往下执行。(碰到循环做循环,碰到选择

做选择,碰到函数调用去执行被调用的函数,调用完后回到调用的下一语句继续)。 概念常考到的:

1、编译预处理不是C语言的一部分,不占运行时间。C语言编译的程序称为源程序,它以

ASCII数值存放在文本文件中。

2、每个C语言程序中main函数是有且只有一个。

3、在函数中不可以再定义函数。也就是说不能嵌套定义函数。 4、程序一定要有输出的,可以没有输入。 变量与常量

1、合法的用户标识符

合法的要求是由字母、数字、下划线组成。有其它字符就错了。并且第一个必须为字母或下划线。第一个为数字就错了。

关键字不可以作为用户标识符号。main define scanf printf 都不是关键字,只是准关键字。If是可以做为用户标识符的,因为If中的第一个字母大写了,所以不是关键字。 2、常量的正确表示

1)整型数据

①十进制整型常量

②八进制整型常量,以0开头,基本数字范围为0~7。

③十六进制整型常量,以0x开头,基本数字范围为0~9,A~F或a~f。 ④在整数常量后可以跟L或l来表示长整型量。 2)实型数据

-1

2.333e-1 就是合法的,表示的数据是2.333×10。考试口诀:e前e后必有数,e后必为整数。

3)字符数据

'1' 是字符占一个字节,"1"是字符串占两个字节(含有一个结束符号’\0’)。 '0' 的ASCII数值是48,'a' 的ASCII数值是97,'A'的ASCII数值是65。 4) 整型是两个字节, 字符型是一个字节,单精度是4个字节,双精度是8个字节。

考试时候一般会说,在16位编译系统,或者是32位系统。我们的考试一般是16位编译系统。 5)转义字符

在程序中 int a=0x6d,是把一个十六进制的数给变量a 注意这里的0x必须存在。 在程序中 int a=06,是一个八进制的形式。

在转义字符中,'\x6d'才是合法的,0不能写,并且x是小写。 '\141' 是合法的, 0是不能写的。 '\108'是非法的,因为不可以出现8。

3、表达式

各运算符优先级记忆方法:括号类?单目运算?双目运算(算术运算?关系运算?逻辑运算)?三目运算?赋值运算?逗号运算

结合性记忆方法:单目运算、三目运算、赋值运算是右结合的,其它都是左结合。 1)/:当参加运算的两边都是整数时,结果为只取整数部分。 2)%:参加运算的两边必须都是整数。

3)++、--:假设a=5,++a(是为6), a++(为5);

运行的机理:++a 是先把变量的数值加上1,然后把得到的数值放到变量a中,然后再用这个++a表达式的数值为6,而a++是先用该表达式的数值为5,然后再把a的数值加上1为6,再放到变量a中。进行了++a和a++后在下面的程序中再用到a的话都是变量a中的6了。考试口诀:++在前先加后用,++在后先用后加。

4)关系表达式

注意==是表示是否相等的比较符

关系运算的结果是数值,1(表示为真),0(表示假) 5)逻辑表达式:

C语言中是用非0表示逻辑真的,用0表示逻辑假的。逻辑表达式的结果是数值,1(表示为真),0(表示假)

注意短路现象。考试比较喜欢考到。

如果多个表达式用&&连接, 则一遇到一个假表达式将使整个连接都为假 如果多个表达式用||连接,则一遇到一个真表达式将使整个连接都为真 6)赋值运算

注意:=是赋值号,==是比较符。判断一个数x为奇数的逻辑表达式如下: x%2!=0 x%2 !(x%2==0),考试时常用x%2 4)条件表达式

表达式1 ? 表达式2 : 表达式3

注意是当非0时是表达式2的数值,当为0是是表达式2的数值。 考试口诀:真前假后。

7)位运算

处理方法:先把十进制变成二进制运算后再变成十进制。 8)二种取整丢小数的情况: 1、int a =1.6; 2、(int)a; 9)表达式的值

赋值表达式:表达式数值是最左边的数值,a=b=5;该表达式为5,常量不可以赋值。 逗号表达式:优先级别最低 ;表达式的数值逗号最右边的那个表达式的数值。(2,3,4)的表达式的数值就是4。

10)强制类型转换

一定是 (int)a 不是 int(a),注意类型上一定有括号的。 注意(int)(a+b)和(int)a+b 的区别。前者是把a+b转型,后者是把a转型后再加b。 输入输出顺序结构

1) printf函数 %d对应整型;%c对应字符;%f对应单精度;%ld对应 long int;%lf 对应double。%

后加上数值,是决定输出宽度的,正数右对齐,负数左对齐。 2) scanf函数

注意该函数的第二个部分是变量的地址。但如果该变量是字符数组或字符指针是不需加地址符号的。

3) putchar ,getchar 函数

char a = getchar() 是没有参数的,从键盘得到你输入的一个字符给变量a。 putchar('y')是把字符y输出到屏幕上。

4)如何实现两个变量x,y中数值的互换(要求必会) 不可以把 x=y ,y=x; 要用中间变量 t=x;x=y;y=t。 分支结构

1)if 语句

else是与最接近的且没有配对的if配对。

2)if(表达式) 后面表达式真假的判断。如a>b>c a=3 a%2等表达式的真假

3)if语句起作用的是紧跟的一句话,如果表达式值为真时要执行多条语句时,一定要加大括号,即

台下形式{语句1;语句2;……语句n;},最后一句也要加分号,}后不要加分号了。 4)除非你想在表达式为真时执行一条空语句,否则不要加分号。

5)switch语句

一定要注意 有break 和没有break的差别,没有break时候,只要有一个case匹配了,剩下的都要执行,有break则是直接跳出了swiche语句。 b)switch只可以和break一起用,不可以和continue一起用。 循环结构

1)三种循环结构:

a)for() ; while(); do- while()三种。

b)for循环当中必须是两个分号,千万不要忘记。

c)写程序的时候一定要注意,循环一定要有结束的条件,否则成了死循环。 d) do-while()循环的最后一个while();的分号一定不能够丢。 2) break 和 continue的差别 记忆方法:

break:是打破的意思,(破了整个循环)所以看见break就退出整个一层循环。

continue:是继续的意思,(继续循环运算),但是要结束本次循环,就是循环体内剩下的语句不再执行,跳到循环开始,然后判断循环条件,进行新一轮的循环。 3)嵌套循环

就是有循环里面还有循环,这种比较复杂,要一层一层一步一步耐心的计算。 4) while((c=getchar())!=’\n’) 和 while(c=getchar() !=’\n’)的差别 先看a = 3 != 2 和 (a=3)!=2 的区别:

!=号的级别高于=号 所以先计算 3!=2,得到的真值1赋值给变量a。第二个式子是变量a的数值是3。

函数

函数:是具有一定功能的一个程序块; 1) 函数的参数,返回数值 int add ( int x, int y)

{ int z; z=x+y; return z; }

main()

{ int a = 5,b=6,c;

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

调用函数语句中的a,b是实参,整个函数得到一个数值就是Add函数的返回数值。 被调用函数x,y是形式参数函数返回数值是整型,z就是这个add函数计算后得到的结果,就是函数返回给主程序的返回数值。

程序是在从上往下顺序执行,当碰到了函数add后,把a,b的数值传给调用函数,程序暂时中断等待返回数值。当得到了返回数值后,再顺序的往下执行。

2)一定要注意参数之间的传递

实参和形参之间传数值,和传地址的差别。(往往是考试的重点)。传数值的话,形参的变化不会改变实参的变化。传地址的话,形参的变化就会有可能改变实参的变化。(说的有可能是因为只是当地址中的内容值改变才会引起实参值的改变,不要认为只要是传地址就改变实参的值)

4) 函数声明

一定要有函数名,函数的返回类型,函数的参数类型。不一定要有形参的名称。形参的名称与定义时不同也可以。 指针

指针变量的本质是用来存放地址的,而一般的变量是存放数值的。 int *p 中 *p和p的差别:

*p可以当做变量来用;*的作用是取后面地址p里面的数值 p是当作地址来使用。

*p++ 和 (*p)++的之间的差别:改错题目中很重要 *p++是 地址会变化。 (*p)++ 是数值会要变化。 三名主义:(考试的重点)

数组名:表示第一个元素的地址。数组名不可以自加,他是地址常量名。(考了很多次) 函数名:表示该函数的入口地址。

字符串常量名:表示第一个字符的地址。 第七章

1一维数组的重要概念: 对a[10]这个数组的讨论。

1、a表示数组名,是第一个元素的地址,也就是元素a[10]的地址。 2、a是地址常量,所以只要出现a++,或者是a=a+2赋值的都是错误的。 3、a是一维数组名,所以它是列指针,也就是说a+1是跳一列。 对a[3][3]的讨论。

1、a表示数组名,是第一个元素的地址,也就是元素a[10]的地址。 2、a是地址常量,所以只要出现a++,或者是a=a+2赋值的都是错误的。 3、a是二维数组名,所以它是行指针,也就是说a+1是跳一行。

4、a[0]、a[1]、a[2]也都是地址常量,不可以对它进行赋值操作,同时它们都是列指针,a[0]+1,a[1]+1,a[2]+1都是跳一列。

5、注意a和a[0] 、a[1]、a[2]是不同的,它们的基类型是不同的。前者是一行元素,后三者是一列元素。

二维数组做题目的技巧:

如果有a[3][3]={1,2,3,4,5,6,7,8,9}这样的题目。

步骤一:把他们写成:

第一列 第二列 第三列 a[0]à 1 2 3 ->第一行 a[1]à 4 5 6 —>第二行 a[2]à 7 8 9 ->第三行 步骤二:这样作题目间很简单:

*(a[0]+1)我们就知道是第一行的第一个元素往后面跳一列,那么这里就是a[0][1]元素,所以是1。

*(a[1]+2)我们就知道是第二行的第一个元素往后面跳二列。那么这里就是a[1][2]元素,所以是6。

一定记住:只要是二维数组的题目,一定是写成如上的格式,再去做题目,这样会比较简单。

数组的初始化,一维和二维的,一维可以不写,二维第二个一定要写 int a[]={1,2} 合法。 int a[][4]={2,3,4}合法。 但int a[4][]={2,3,4}非法。 二维数组中的行指针 int a[1][2];

其中a现在就是一个行指针,a+1跳一行数组元素。 搭配(*)p[2]指针

a[0]

,a[1]现在就是一个列指针。a[0]+1 跳一个数组元素。搭配*p[2]指针数组使用 还有记住脱衣服法则:

a[2] 变成 *(a+2) a[2][3]变成 *(a+2)[3]再可以变成 *(*(a+2)+3) 这个思想很重要!

a+0? a+1? a+2? a+3?

*(*(a+3)+1)

(*(a+3))[2]

*(a[3]+3)

 

第二篇:c语言知识点总结

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

第一章

  1,函数是从主函数(main())开始执行,回到主函数(main())结束;

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

第二章

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

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

第三章 

1,int类型是2个字节,float是4个字节,dooble是8个字节

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

  3,变量的地址是确定的,变量变的地方只是地址里面的值。

  4,用户标志符,由数字,字母,下划线构成,第一个不能是数字,但是32个关键字除外。

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

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

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

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

  7,当出现’\0’的什么时候为结束,什么时候为八进制的转义字符:’\0’后面有17之间的数字的时候为转义字符;其他的时候为字符串结束标志,注意转义字符有哪些(参考书p8)

  这样一个例题 若 strlen(”abc\089”)=3    strlen(“abc\012”)=4

  8,强制转换不会改变一个变量的值,只是改变其作用的那个表达式的值。

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

  10,复合运算符要注意当等号后面接的是表达式的时候要把表达式看成一个整体即x *=y+8等价于x=x*(y+8),y8是一个整体

第四章

   1,格式输入和输出的时候,注意格式。要严格按照题目的格式进行操作。(在做题的时候尤其是读程序写结果的时候要细心哈!)

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

第五章

   1,关系运算符,>,<,<=,>=,= =,!= ,==和!=优先级最低,主意=与==的区别:=是赋值的意思,表达式的值是对变量赋的值,==是关系运算符,关系运算表达式的值为0或者1.

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

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

   3,if语句基本格式:1有else的情况是:if(表达式)语句;else语句;(注意有分号哦),2没有else的情况是:if(表达式)语句;当有多个if和else的时候if是与其后最近的没有配对的else结合;注意,当函数作为if里面的表达式的时候即if(printf(“*”))的时候,则是以函数的返回值判断if的真假,printf输出以1个字符则返回为1,所以这个if是真的;

  4条件表达式,? :  ;右结合性,是从右往左结合,即是以最后一个?开始结合,但是计算顺序仍然是从左到右(这个牵涉到++,--问题)(参考书p16)

  5,switch语句,switch语句只有碰到break或者做到最后一个语句才结束,case和default语句都只是入口。(参考书p17页例子)

第六章

  1,while语句基本格式是while(表达式)语句;注意在while()后面没有;号,当函数或者赋值表达式放在while的()中时与if的判断方法一样,时候函数的返回值或表达式值的逻辑值;

  2,do{  }while();语句和while语句的区别在于前者先做后判断后者是先判断后做,这个知识点多参考书上(p18例题)和卷子上的题

  3,for语句,例如:for(i=1;i<100;i++)                   

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

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

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

                   forj0j<5;j++ 

ssi ;  这个时候是先做i=0;然后判断i;然后做加粗的部分,即是把加粗部分看成一个整体做完之后才会回到i++;所以ssi ;这个语句做了20次,(参考书p19例题)

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

  5,break是结束整个循环;contine结束本层循环;具体参考书(p19页例子这个很重要哦,一定要掌握)

第七章和第十章(重点哦!!!!!!)

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

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

  3,对一个数组的输入输出总结

当数组是int(整形的时候)

一个有n个元素的1维数组:输入   for(i=0;i<n;i++)   

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

        输出    for(i=0;i<n;i++)

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

一个有n行m列的2维数组:输入:for(i=0;i<n;i++)(这里i控制行,j控制列)

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

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

                           输入:for(i=0;i<n;i++)

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

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

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

(1)for(i=0;i<n;i++)

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

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

输出也对应有两种方式:(1),for(i=0;i<n;i++)  

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

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

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

1,  for(i=0;i<n;i++)                     2,for(i=0;a[i]!=’\0’;i++)      

       a[i];     (都是指从a[0]访问到a[n1]        a[i];  参考书p31

  5,对字符串的操作注意:sizeof是一个系统关键字,不是函数,求其后边的参数占用的内存空间,strlen 求字符串中有多少有效字符。

   注意这个例题:char a[30]=“abc\0b”;   sizeof(a)=30 ;   sizeof(“abc\0b”)=6;

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

  6,*p++  表达式中p与++先结合,取完值之后地址指向下一个元素的地址;*++p则是直接输出第二个元素,指针输出完之后,也指向了下一个元素的地址

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

  8,自编函数实现求字符串的长度:

          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);    }

第八章

  1,分清形参和实参的区别:(1)形参是在定义或声明中,实参是在引用当中;当函数名前有int ,float, char等类型名时是定义或者声明,但是要排除省略类型名的情况;一般引用出现在主函数中,(2)形参是不确定的值,因此不能为常量,实参是确定的值所以可以为常量

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

  例:(1),int subint xint y

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

  void main()

{  int a=3,b=2;subab

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

(2),int subint* xint *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

  3,局部变量和全局变量;注意分清各自的作用范围;参考书p64 第4题

  4,注意形参和实参必须赋值兼容,也就是说形参和实参维数必须一样;注意区别viod和return;当主函数里面带参数的形式,main(int argc,char *argv[])中argc是表示参数的个数,argv这个数组储存的是具体的参数个数。例,

void main(int argc,char *argv[])

       {   char  **p ;

while(――argc)

{  *p=argv[argc];

puts(*p); }

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

  5,注意函数的调用以及静态变量;参考各次卷子中关于这个方面的题

第九和十一章

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

例:#define xx(m) m*m

 …… int i=5;

i=i+xx(4+5);

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

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

 3,结构体变量的长度是各个成员长度的和;当结构体指针和数组的时候注意分清 . 和->的区别;参考书中p59第3题

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

 5,链表的题就掌握模拟考试题中的一道选择题就可以了;第十一章的其他内容,还是要去看书了解 

第十二章和第十三章

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

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

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

 4,文件在什么情况下结束(1),fp==EOF的时候结束fp!=EOF的时候不结束。

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

 5,注意背下书p139第2题,万一考到文件的编程一般就是这种题。一般填空就是上面的加粗部分。

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

  

编者的话:

这些只是基础知识的重点,目的是帮助大家复习基础知识(记住这个只是基础的一部分,仅仅是基础,各个基础知识的运用请大家多参考发的卷子和书后面的习题),大家还是争取要把书细细的看上2遍以上,最后祝大家都能顺利的过二级。

                                 

                                        作者:好老师工作组                                          

 
相关推荐