• 工作总结
  • 工作计划
  • 心得体会
  • 述职报告
  • 思想汇报
  • 发言讲话稿
  • 演讲稿
  • 申请书
  • 读后感
  • 报告材料
  • 策划方案
  • 当前位置: 写作资料库 > 其他范文 > 正文

    [C语言易错点考点(完整版)]c语言指针易错点

    时间:2020-07-19 22:10:53 来源:写作资料库 本文已影响 写作资料库手机站

    总体上必须清楚的: 1)程序结构是三种: 顺序结构 , 循环结构(三个循环结构), 选择结构(if 和 switch) 2)用C语言编写的程序称为C语言源程序,源程序文件的后缀名为“.c”;
    源程序经编译后生成后缀名为“.obj”的目标文件;
    再把目标文件与各种库函数连接起来,生成“.exe”的可执行文件。

    3)main函数,又称主函数,每个C程序有且只有一个main函数;
    无论main函数在整个程序中的位置如何,程序总是从main函数开始执行、也从main函数结束。读程序时应从main函数开始, 然后从上往下读(碰到循环做循环,碰到选择做选择)。

    4)计算机的数据在电脑中保存是以 二进制的形式. 数据存放的位置就是 他的地址. 5)bit是位 是指为0 或者1。

    byte 是指字节, 一个字节 = 八个位. 6)一定要记住 二进制 如何划成 十进制。

    概念常考到的:
    1、编译预处理不是C 语言的一部分,不占运行时间,不要加分号。C语言编译的程序称为源程序,它以ASCII数值存放在文本文件中。

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

    3、在函数定义中不可以再定义函数、即不允许函数嵌套定义。

    4、算法可以没有输入,必须要有输出。

    5、break可用于循环结构和switch语句。

    6、逗号运算符的级别最低。

    7、任意合法的表达式一定有一个数值与它对应。

    第一章 1)C程序中对字母的大小写是敏感的,如A与a是不同的标识符。

    注释:是对程序的说明,目的是提高程序的可读性,可出现在程序中任意合适的地方,注释从“/*”开始到最近一个“*/”结束,其间任何内容都不会被计算机执行,不允许嵌套注释。

    3)合法的用户标识符考查:
    合法的要求是由字母,数字,下划线组成。有其它元素就错了。

    并且第一个必须为字母或则是下划线。第一个为数字就错了。

    关键字不可以作为用户标识符号。main define scanf printf 都不是关键字。迷惑你的地方If是可以做为用户标识符。因为If中的第一个字母大写了,所以不是关键字。

    注意:连接(-)符不能出现在标识符中;
    区分字母o与数字0,字母l和数字1;
    熟悉常见的关键字 4)实型数据的合法形式:
    2.333e-1 就是合法的,且数据是2.333×10-1。

    考试口诀:e前e后必有数,e后必为整数。. 5)字符数据的合法形式::
    '1' 是字符占一个字节,“1“是字符串占两个字节(含有一个结束符号)。

    '0' 的ASCII数值表示为48,'a' 的ASCII数值是97,'A'的ASCII数值是65。

    一般考试表示单个字符错误的形式:'65' “1“ 字符是可以进行算术运算的,记住:
    '0'-0=48 大写字母和小写字母转换的方法:
    'A'+32='a' 相互之间一般是相差32。

    大小写字母的转换:
    大写字母转换成对应小写字母:ch + 32 如 ‘A’ + 32 = ‘a’ 小写字母转换成对应大写字母:ch – 32 如 ‘y’ – 32 = ‘Y’ 口诀:大小字母转换正相反,加大转小,减小转大。

    数字字符与对应数字的转换:ch – 48 如 ‘1’ – 48 = 1 4)整型一般是两个字节, 字符型是一个字节,双精度一般是4个字节:
    考试时候一般会说,在16位编译系统,或者是32位系统。碰到这种情况,不要去管,一样做题。掌握整型一般是两个字节, 字符型是一个字节,双精度一般是4个字节就可以了。

    5)转义字符的考查:
    在程序中 int a = 0x6d,是把一个十六进制的数给变量a 注意这里的0x必须存在。

    在程序中 int a = 06d, 是一个八进制的形式。

    在转义字符中,’\x6d’ 才是合法的,0不能写,并且x是小写。

    ‘\141’ 是合法的, 0是不能写的。

    ‘\108’是非法的,因为不可以出现8。

    什么是转义字符:所有的ASCII码都可以用“\”加数字【一般是8进制数字】来表示。而C中定义了一些字母前加“\“来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了。

    6)算术运算符号的优先级别:
    同级别的有的是从左到右,有的是从右到左。

    补充两点:
    1、算术运算 算术运算符一共有+、—、*、/、%这五个;
    求余运算要求运算对象只能为【整型】,除法运算符两边运算对象都为整型时,运算结果也为整型,即舍掉小数部分。

    例如:18 / 10结果为1,而不是1.8 ;

    3.5 % 3是非法的表达式 2、赋值运算及表达式 赋值运算符为“=”,不同于关系等于“= =”。赋值表达式格式为:变量名=表达式,赋值运算符左边必须为变量,赋值运算是把赋值运算符右边表达式的值赋给左边变量。

    注意赋值运算符和复合赋值运算符的优先级仅仅高于逗号运算符,结合性为从右到左 例如:有语句 int a=5 ; 表达式 a = 6 值为6,而表达式 a = = 6结果为0 7)强制类型转换:
    一定是 (int)a 不是 int(a),注意类型上一定有括号的。

    注意(int)(a+b)和(int)a+b 的区别。

    前是把a+b转型,后是把a转型再加b。

    8)表达式的考查:
    是表达式就一定有数值。

    赋值表达式:表达式数值是最左边的数值,a=b=5;该表达式为5,常量不可以赋值。

    自加、自减表达式:假设a=5,++a(是为6), a++(为5);

    运行的机理:++a 是先把变量的数值加上1,然后把得到的数值放到变量a中,然后再用这 个++a表达式的数值为6,而a++是先用该表达式的数值为5,然后再把a的数值加上1为6, 再放到变量a中。

    进行了++a和a++后在下面的程序中再用到a的话都是变量a中的6了。

    考试口诀:++在前先加后用,++在后先用后加。

    逗号表达式:优先级别最低 ;
    表达式的数值逗号最右边的那个表达式的数值。

    (2,3,4)的表达式的数值就是4。

    9)位运算的考查:
     会有一到二题考试题目。

    总的处理方法:几乎所有的位运算的题目都要按这个流程来处理(先把十进制变成二进制再变成十进制)。

    例1: char a = 6, b;
      b = a<<2; 这种题目的计算是先要把a的十进制6化成二进制,再做位运算。

    例2:
    一定要记住,异或的位运算符号。0 异或 1 得到1。

    0 异或 0 得到0。两个女的生不出来。

    1 异或 1 得到0。两个男的生不出来。

    考试记忆方法:一男(1)一女(0)才可以生个小孩(1)。

    例3: 在没有舍去数据的时候,<<左移一位表示乘以2;
    >>右移一位表示除以2。

    10)018的数值是非法的,八进制是没有8的,逢8进1。

    11)%符号两边要求是整数。不是整数就错了。

    12) 三种取整丢小数的情况:
    1、int a =1.6;

    2、(int)a;

    3、1/2;

    3/2;
        左移运算符“<<” 右移运算符“>>” 第二章 1)printf函数的格式考查:
    %d对应整型;
    %c对应字符;
    %f对应单精度等等。宽度的,左对齐等修饰。

    %ld对应 long int;
    %lf 对应double。

    2)scanf函数的格式考察:
    注意该函数的第二个部分是&a这样的地址,不是a;

    Scanf(“%d%d%*d%d”,&a,&b,&c); 跳过输入的第三个数据。

    3)putchar ,getchar 函数的考查:
    char a = getchar() 是没有参数的,从键盘得到你输入的一个字符(包括回车、空格等字符)给变量a。

    putchar(‘y’)把字符y输出到屏幕中。

    4)如何实现两个变量x ,y中数值的互换(要求背下来)
    不可以把 x=y ,y=x; 要用中间变量 t=x;
    x=y;
    y=t。

    5)如何实现保留三位小数,第四位四舍五入的程序,(要求背下来)
    (int)( n*1000 + 0.5) / 1000.0 这个有推广的意义,注意 x = (int)x 这样是把小数部分去掉 第三章 特别要注意:c语言中是用非0表示逻辑真的,用0表示逻辑假的。

    1)关系表达式:
    表达式的数值只能为1(表示为真),或0(表示假)
    当关系的表达是为真的时候得到1。如 9>8这个是真的,所以表达式的数值就是1;

    2)逻辑表达式:
    只能为1(表示为真),或0(表示假)
    a) 共有&& || ! 三种逻辑运算符号。

    b) !>&&>|| 优先的级别。

    c) 注意短路现象,考试比较喜欢考到。例a++||b++,如果表达式a++的值非零,则表达式b++不再执行。

    d) 要表示 x 是比0大,比10小的方法。0<X<10是不可以的(一定记住)。< span>是先计算0要用 (0<X)&&(X<10)表示比0大比10小。< span> 3)if 语句 else 是与最接近的if且没有else的相组合的。

    4)条件表达式:
     表达式1 ?表达式2 :表达式3 注意是当表达式1值为非0时,整个表达式值为表达式2的值,表达式1值为0时,整个表达式值为表达式3的值。

      考试口诀:真前假后。

    5)switch语句:
    a)一定要注意 有break 和没有break的差别,书上(34页)的两个例子,没有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)
    第一个a的数值是得到的1;
    第二个a的数值是3。

    考试注意点: 括号在这里的重要性。

    第五章 函数:是具有一定功能的一个程序块;

    1) 函数的参数,返回数值(示意图):
    main() { int a = 5,b=6,c; c = add(a,b); printf(“%d”,c); } 调用函数 a,b是实参 整个函数得到一个数值就是 Add函数的返回数值。

    int add ( int x, int y) { int z; z=x+y; return z; } 被调用函数 x,y是形式参数 函数返回数值是整型 z就是这个add函数计算后得到的结果,就是函数返回给主程序的返回数值。

    程序是在从上往下顺序执行,当碰到了函数add后,把a,b的数值穿给调用函数,程序暂时中断等待返回数值。当得到了返回数值后,再顺序的往下执行 2)一定要注意参数之间的传递 实参和形参之间 传数值,和传地址的差别。(考试的重点)
    传数值的话,形参的变化不会改变实参的变化。

    传地址的话,形参的变化就会有可能改变实参的变化。

    3)函数声明的考查:
    一定要有:函数名,函数的返回类型,函数的参数类型。

    不一定要有:形参的名称。

    第六章 指针变量的本质是用来放地址,而一般的变量是放数值的。

    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)
    这个思想很重要!