2016福建省计算机二级C语言复习经典资料全_第1页
2016福建省计算机二级C语言复习经典资料全_第2页
2016福建省计算机二级C语言复习经典资料全_第3页
2016福建省计算机二级C语言复习经典资料全_第4页
2016福建省计算机二级C语言复习经典资料全_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.PAGE.C语言最重要的知识点复习资料!总体上必须清楚的:

1>程序结构是三种:顺序结构,循环结构<三个循环结构>,选择结构<if和switch>

2>读程序都要从main<>入口,然后从最上面顺序往下读<碰到循环做循环,碰到选择做选择>。

3>计算机的数据在电脑中保存是以二进制的形式.数据存放的位置就是它的地址.

4>bit是位,是指为0或者1。byte是指字节,一个字节=八个位.

5>一定要记住二进制如何划成十进制。

概念常考到的:

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

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

3、在函数中不可以再定义函数。

4、算法的是一定要有输出的,他可以没有输入。

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

6、逗号运算符的级别最低。第一、二章C语言基础及简单程序设计c语言由什么构成;〔函数:一个C语言程序由一个至多个函数组成,main<>是主函数,该函数既是入口又是出口〔一个入口,一个出口数据类型:基本数据类型<整型,字符,实型,枚举型>,占用内存的字节数,表示范围常量:123,0101<没有8和9>,0x41,'1',-2.30,-1.2E+5在一个字节内,字符通整型,整型通字符合法的用户标识符考查:

合法的要求是由字母,数字,下划线组成,并且第一个必须为字母或则是下划线。

关键字不可以作为用户标识符号。main

define

scanf

printf都不是关键字。迷惑你的地方If是可以做为用户标识符。因为If中的第一个字母大写了,所以不是关键字。实型数据的合法形式:考试口诀:e前e后必有数,e后必为整数。.2.333e-1就是合法的,且数据是2.333×10-1。字符和字符串数据的合法形式::

'1'是字符占一个字节,"1"是字符串占两个字节<含有一个结束符号>。

'0'的ASCII数值表示为48,'a'的ASCII数值是97,'A'的ASCII数值是65。转义字符的考查〔p28:转义符\:'\n','\0','\ddd','\xdd'等强制类型转换:

一定是〔inta不是

int〔a,注意类型上一定有括号的。

注意〔int〔a+b和〔inta+b的区别。前是把a+b转型,后是把a转型再加b。

自加、自减表达式:假设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。位运算的考查:口诀:先转二进制再运算

总的处理方法:〔先把十进制变成二进制再变成十进制。

例1:chara=6,b;

b=a<<2;

这种题目的计算是先要把a的十进制6化成二进制,再做位运算。

例2:在没有舍去数据的时候,<<左移一位表示乘以2;>>右移一位表示除以2。%符号两边要求是整数。不是整数就错了。变量:变量的命名规则满足标识符的命名规则,区分大小写,关键字<p7>除外,变量的定义一般都要放在函数或程序的开头位置〔即先定义后使用分号:表示一个语句结束变量的定义:类型名变量名列表;<不同的类型要写成两句>,定义的时候给值成为变量的初始化,初始化的时候不能连等〔如inta=b=c=1;是错的!inta,b,c;a=b=c=1;是对的。变量的赋值:变量名=表达式或变量名复合赋值运算符表达式<复合赋值运算符:+=,*=,^=,...>,如:xyz+2=c行吗?不行〔赋值表达式左边只能是变量!赋值的时候可以连等。输入一个字符:x=getchar<>,putchar<x>,有这两个函数及FILE时一定要加上#include<stdio.h>//标准输入输出的头文件包含getch<>,表示暂停程序运行,可直接查看结果,否则运行完后不显示结果〔需按ALT+F5。printf<"xxxxxxxxxxxxxxx">;或printf<"格式控制符",变量列表>;变量列表不加&scanf<"格式控制符",地址列表>,地址列表可为数组名、指针变量名及普通变量名〔普通变量名前要加加&。printf<"%m.nf",32.6789>scanf的格式控制符中,除了逗号,一般不加其他字符;一定要记住,有逗号时输入要加逗号,否则:数据用空格隔开,字符连着输入;没有"%m.nf"的写法,只有"%mf"的写法,

float型用"%f",double型用"%lf",longdouble用"%Lf"不同类型的数值型数据进行混合运算不同类型的数值型数据进行混合运算时,先要把低数据类型向高数据类型转换,成为同一类型后才进行运算。横向箭头表示必须进行的转换。逗号运算符是最低的运算符常量不能++、--;例:b=<a=1,a++,a++>,又例:b=<a=2>+<a=3>,又例:a=1;b=<++a>+<++a>=与==的区别〔赋值和等号在C语言中,对于逻辑运算,非零的数〔不管实数还是整数都认为是真的,真的就是

1,假的就是0;关系运算的结果是逻辑值〔真为1假为0。运算符:运算符的优先序〔p246:成单算移关于,异或逻条赋逗。运算符的结合性〔p246:条件、单目、赋值运算符。〔printf输出也是自右而左运算『所有运算符』成员运算:<"<>",[],->,结构体成员.>成员运算:<"<>",[],->,结构体成员.>单目运算:<!,-,++,--,取值*,取址&,位取反~>算术运算:<*,/,%>级别高于<+,->位移运算:<<<,>>>关系运算:<>,>=,<,<=>级别高于<==,!=>位与运算:<&>位异或运算:<^>位或运算:<|>逻辑运算:<&&>级别高于<||>条件运算:<?:>赋值算:<=,+=,...,<<=,>>=,&=,|=,^=>逗号运算:<,>例如.以下程序的运行结果是structst{intn;floatx;}*p;voidmain<>{structstarr[3]={{10,5.6},{12,7.1},{14,6.7}};p=arr;printf<"%d\n",++p->n>;p++;printf<"%d,%.2f\n",p->n,p->x>;}A>12B>11C>11D>1212,7.1010,5.6012,7.1014,6.70第三、四章选择和循环结构C程序一般采用自顶向下的编写格式,模块化<函数>C程序结构有三种:顺序,选择<分支>,循环{}:用在函数,或复合语句分支结构〔或选择结构[if结构和switch结构]if分支结构单分支: if<表达式>语句;或if<表达式>{语句组}双分支:if<表达式>语句1;else语句2;多分支if:if<表达式1>语句1;elseif<表达式2>语句2;...elseif<表达式n-1>语句n-1;else语句n;多分支switch:switch<x> {casex1:语句1;[break;]...casexn:语句n;[break;]default:语句;[break;]}例:main<>{intc;while<<c=getchar<>>!='\n'>{switch<c-'2'>{case0:case1:putchar<c+4>;case2:putchar<c+4>;break;case3:putchar<c+3>;default:putchar<c+2>;break;}}printf<"\n">;}当输入:247<回车>,程序的输出结果是〔。<A>689<B>6689<C>66778<D>66887switch总结:其语义是:先计算出表达式的值,用此值与哪个case后的常量表达式的值相一致,则执行那个case后的语句组,如果语句组后有break语句则直接退出switch结构,如语句组执行后没有break语句则继续执行后续case后的语句组,直到遇到break语句退出switch结构,如没有break语句则会执行后续所有case或default后的语句组再退出switch结构。若计算出表达式的值与case后的所有常量表达式的值都不同则只执行default及之后的语句组一直执行到最后〔若遇break则终止退出switch结构,如没有default语句则直接退出switch结构。循环语句:<1>for<表达式1;表达式2;表达式3>或for<表达式1;表达式2;表达式3>{循环体语句组;循环体语句;...[break;]/*用于结束当层循环,跳到当层循环后面的语句。*/...[continue;]/*用于结束当次循环,跳过当次循环后面的语句,进入下次循环。*/...}<2>while<表达式>while<表达式>{循环体语句组;循环体语句;...[break;]...[continue;]...}<3>do{循环体语句组;...[break;]...[continue;]...}while<表达式>;例:for<i=1;i<=10;i++>for<i=1;i<=10;i++>{{if<i%2==0>break;if<i%2==0>continue;printf<"%d",i>; printf<"%d",i>;}}循环嵌套:从外循环进来,内循环结束后,再到外循环,如此反复,直到外循环结束x=0;或x=0;for<i=1;i<=2;i++>for<i=1;i<=2;i++>for<j=1;j<=i;j++>{j=1;x+=i*j;while<j<=i>{x+=i*j;j++;}}break可用于switch和循环语句,一个break只退出一层;而continue只对循环有效记住:质数的判断,斐波那契数列,辗转相除法,求数列的和〔有正符号如何处理?置标志位循环总结:for循环与while循环类似,属于先判断后执行;dowhile,属于先执行后判断for语句中有三个表达式:表达式1通常用来给循环变量赋初值;表达式2通常是循环条件;表达式3用来更新循环变量的值for语句中的各个表达式都可以省略,但要注意分号分隔符不能省略如果省略表达式2和表达式3需要在循环体内设法结束循环,否则会导致死循环break语句用在循环中时,可以直接终止当前循环,将控制转向循环后面的语句continue语句的作用是跳过循环体中剩余的语句而执行下一次循环嵌套循环时,必须将被嵌套的循环语句完整地包含在外层循环的循环体内第五章函数系统函数:数学类函数〔math.h,输入输出函数〔stdio.h,字符串类函数〔string.h自定义函数:格式类型名函数名<形式参数列表>{函数体 }不写函数类型名默认为整型如果函数类型名为void表示无返回值函数〔不写return声明如果调用函数写在被调函数之前,且被调函数类型名不是整型<或字符型>,则在调用函数中或调用函数之前应该先声明,如何声明?声明:类型名函数名<形式参数列表>;声明函数的递归:直接或者间接调用自身。〔如阶乘全局变量:在函数外定义的变量,如果定义时没给值,默认为0局部变量:在函数内定义的变量、形式参数、复合语句中定义的变量,如果没给具体的值,该值不确定对于全局变量和局部变量主要观察在函数中是否被重新定义,若全局变量和局部变量同名,则自动屏蔽掉全局变量。函数调用时,实参向形参传递:<1>按值传递:形参的变化不会改变实参的变化。〔若有返回值将值带回,否则带回控制流,函数的返回值类型与函数类型一致;<2>按地址传递:形参的变化就会有可能改变实参的变化。<3>数组传递,通常就把数组名及数组元素传过去如果一个函数名为:fun<x>,严禁出现:fun<x>=…,不管递归与否〔满足标识符命名returny;或return〔y;不要写成returny1,y2;静态变量:staticintx;<1>没给值,默认为0;<2>始终占用内存,其值会保留下来〔即赋值一次,不再重新赋值,保留上次运行结果[静态变量]举例eg:以下程序的运行结果是〔C。fun3<intx>main<>{staticinta=3;{intk=2,m=1,n;a+=x;n=fun3<k>;returna;n=fun3<m>;}printf<"%d\n",n>;}A、3B、4C、6D、9宏定义:#define标识符字符串,宏一定要先替换后计算分带参和无参宏定义无参宏定义如#definePx*x//表示碰到P时用x*x替换带参宏定义如#defineP〔xx*x//表示碰到P〔x时用x*x替换[无参宏定义]举例若有定义:#defineN3+2,则表达式N*2的值为〔B。A、5B、7C、10D、0解释:N*2=3+2*2=3+4=7。[带参宏定义]举例以下程序运行后输出结果是〔B。#defineMIN<m,n>m<n?m:nmain<>{inta=3,b=5,c;c=2*MIN<a,b>;printf<"%d",c>;}A、3B、5C、6D、10解释:c=2*MIN<a,b>=2*a<b?a:b2*3<5?3:5。第六章数组一维数组的定义格式为:类型说明符数组名[常量表达式];例如:inta[10];常量表达式可以是整型常量或字符常量或枚举值或符号常量表达式<注意不能包含变量>.例如,下面这样定义数组是不行的:举例:intn;scanf<"%d″,&n>;inta[n];intk,M=5,a[k],b[M];/*不能用变量说明数组大小*/floata[0]; /*数组大小为0没有意义*/intb<2>;/*不能使用圆括号*/数组元素下标可以是整型常量、变量、变量或整型表达式。C语言规定,下标的最小值是0,最大值则是数组大小减1。eg:m[8]中,表示数组m有8个元素,下标从0开始一直到7。这8个数组元素分别是:m[0]、m[1]、m[2]、m[3]、m[4]、m[5]、m[6]、m[7],注意没有m[8]。对一维数组的初始化赋值<1>可以只给部分元素赋初值。没有赋值的元素:对于数值型数组,自动赋初值为0;对字符型数组,自动赋初值为空字符。<2>只能给元素逐个赋值,不能给数组整体赋值。intm[5]={2,2,2,2,2};不能写成:intm[5]=2;<3>如果给全部元素赋值,则在数组说明中,可以不给出数组元素的个数,其长度等于初值表中数组元素的个数。intm[]={1,2,3,4,5};二维数组元素的引用形式:数组名[下标1][下标2];二维数组元素的初始化分行初始化:存储类型符数据类型数组变量名[行常量表达式][列常量表达式]={{第0行初值表},{第1行初值表},……,{最后1行初值表}};Eg:若有定义:ints[3][4]={{1,2},{0},{3,4,5}};则s[2][1]的值为〔B。A. 3 B.4 C.0 D.1省略一维大小:存储类型符数据类型数组变量名[行常量表达式][列常量表达式]={初值表};Eg:inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};printf<"%d\n",a[1][2]>;A. 2 B.3 C.6 D.7字符数组的定义格式:char数组名[常量表达式];在c语言中,没有专门的字符串变量,通常是用一个字符数组来存放一个字符串,由于字符串总是以‘\0’作为串的结束标志,因此当把一个字符串存入一个数组时,也把结束符‘\0’存入数组,并以此作为该字符串结束的标志C语言允许用字符串的方式对数组做初始化赋值。有两种方式:<1>按单个字符的方式赋初值,其中必须有一个字符是字符串的结束标记〔但字符数组可以不包括’\0’。如chars[]={‘1’,’2’,’3’,’\0’};<2>直接在初值表中写一个字符串常量。如chars[]={"123"};{}可以省略chars[]={‘1’,’2’,’3’,’\0’};<=>chars[]={"123"};<=>chars[]="123";设已定义chars[]="\"Name\\Address\023\n";,则字符串所占的字节数是〔B。A.19 B.16 C.18 D.14字符串的常用串函数strlen函数——测试字符串长度格式:strlen〔字符数组;功能:测试指定字符串的实际长度〔不含字符串结束标志‘\0’,并返回字符串的长度其中,函数的参数可以是字符型数组名或字符串常数,函数的返回值是字符串的长度。strlen得到的是有效字符的个数〔不包括‘\0’sizeof得到的是整个数组的长度〔包括‘\0’strcat函数——字符串连接函数格式:strcat<字符数组1,字符数组2>;功能:把字符数组2中的字符串连接到字符数组1中字符串的后面,同时删去字符串1的串标志‘\0’,组成新的字符串。该函数返回值是字符数组1的首地址strcmp函数——字符串比较函数格式:strcmp<字符串1,字符串2>;功能:字符串1和字符串2可以是字符型数组名或字符串常量。按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果strcpy函数——字符串拷贝函数格式:strcpy<字符数组1,字符数组2>;功能:把字符数组2中的字符串拷贝到字符数组1中。字符串结束标志‘\0’也一同拷贝。字符数组2也可以是一个字符串常量,这时相当于把一个字符串赋予一个字符数组注意:字符数组1必须定义的足够大,以便能容纳被复制的字符串,字符数组1的长度不应该小于字符串2的长度;字符数组1必须写成数组名形式,字符数组2可以是字符数组名,也可以是一个字符串常量;有时只需要复制字符数组2中前面若干个字符,这些用strcpy函数也能实现。如:strcpy〔m1,m2,3表示将m2前面3个字符复制到m1中,从而取代m1中最前面的3个字符。冒泡排序、直接排序、交换排序杨辉三角、矩阵转置〔矩阵转置只要循环一半就可以。一维数组倒序存放、矩阵转置只要循环一半就可以指针本章主要内容:指针的概念、定义和引用、指针与函数、指针与数组、指针与字符串、指针数据类型小结指针变量的本质是用来放地址,而一般的变量是放数值的。

int

*p中

*p和p的差别:

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

*p++和〔*p++的之间的差别:改错题目中很重要

*p++是地址会变化;〔*p++是数值会要变化。指针变量的定义:一般形式为:类型符*指针变量名;如:int*p;指针变量的引用。两种基本的指针运算:&:取变量的地址*:指针运算符〔或称"间接访问"运算符指针变量作函数参数[例7.3]用函数实现两个变量的交换voidswap<int*p1,int*p2>{ int*t;t=*p1; *p1=*p2; *p2=t;}main<>{ inta=5,b=9;swap<&a,&b>;printf<"a=%d,b=%d\n",a,b>;}指针函数〔函数的返回值为指针一般定义为:类型符*函数名<参数表>{……}[例7.4]把两个数中的最大值设为0int*max<int*q1,int*q2>{return*q1>*q2?q1:q2;}main<>{ intx=5,y=9,*p;p=max<&x,&y>;*p=0;printf<"x=%d,y=%d\n",x,y>;}函数指针〔用一个指针变量存储一个函数入口地址,即指向函数,这样的指针称函数指针定义形式为:类型符<*函数指针变量><>;如:int<*p><>;使函数指针指向一个函数,一般的格式为:函数指针变量=函数名;如:p=max;调用函数。一般格式为:<*函数指针><实参表>如:c=<*p><a,b>;[例7.5]通过函数指针调用函数intmax<intx,inty>{returnx>y?x:y;}intmin<intx,inty>{returnx<y?x:y;}main<>{ inta=5,b=9,c,d;int<*p><>;//定义函数指针p=max;//指向函数 c=<*p><a,b>;//调用函数p=min; d=<*p><a,b>; printf<"Max=%d,Min=%d\n",c,d>;}指针与数组的关系一个变量有地址,一个数组包含若干个数组元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址,这个地址就可以用指针来实现存储。如有:inta[5],*p,*q;p=&a[0];q=&a[2];*p=5;*q=8;则a[0]和a[2]值分别为5和8。C语言规定:数组名代表数组的首地址,也就是第一个元素a[0]的地址。因此:a&a[0]。若:p=a; /*或写成p=&a[0];*/则:p+1&a[1]*<p+1>a[1]p+i&a[i]*<p+i>a[i]引用一个数组元素,可以用下标法或指针法。通过数组的起始地址计算数组元素的地址,即*<a+i>或*<p+i>形式。用指针变量处理数组元素,即p++形式:main<>{ inta[5]={3,8,9,2,6},i,*p; p=a;for<i=0;i<5;i++>{ printf<"%d",*p>; p++;}}[例7.5]指针运算符"*"与增1运算符"++"同时作用于一个指针变量的情况。main<>{inti,a[]={11,22,33,44,55,66},*p=a;printf<"%3d,",<*p>++>;11printf<"%3d,",*p++>;12printf<"%3d,",*++p>;33printf<"%3d\n",++*p>;34for<p=a;p<a+6;p++>printf<"%3d,",*p>;122234445566printf<"\n">;getch<>;}2、通过指针引用二维数组元素<1>二维数组和数组元素的地址inta[3][4]={{1,2,3,4},{6,7,8,9},{11,12,13,14}}

a[0]a[1]a[2]则a<=>&a[0],a+1<=>&a[1],a+2<=>&a[2]对于一维数组名为a[0],则a[0]<=>&a[0][0],a[0]+1<=>&a[0][1].所以第0行第1列的地址表示为a[0]+1.所以a[i]+j是第i行第j列元素的地址&a[i][j],又a[i]等价于*<a+i>所以在二维数组里*<a+i>+j和a[i]+j都表示地址。<2>通过地址访问二维数组假设有如下定义:inta[3][5],i,j;则二维数组a中的任一元素a[i][j],可以用下述表达式之一来引用表示:*<a[i]+j>由上述知a[i]+j是第i行第j列元素的地址,因此*<a[i]+j>与a[i][j]等价*<*<a+i>+j>,*<a+i>+j也是第i行第j列元素的地址,因此*<*<a+i>+j>与a[i][j]等价<*<a+i>>[j],相当于先取*<a+i>+j地址,再取其内的值,所以与a[i][j]等价*<&a[0][0]+5*i+j>由于每行5个元素,&a[0][0]+5*i+j就是第i行第j列元素的地址,因此*<&a[0][0]+5*i+j>也与a[i][j]等价*<&a[0][0]+5*i+j><=>*<a[0]+5*i+j><=>*<*a+5*i+j><=>a[i][j]<3>通过指向元素指针访问二维数组如:inta[3][5],i,j,*p;p=&a[0][0];或p=*a;或p=a[0];则a[i][j]等价于*<p+i*5+j>等价于p[i*5+j]数组名作函数参数的指针解释[例7.7]对形参数组改为指针。intarray_max<intx[],intn>{ inti,m=x[0]; for<i=1;i<n;i++> if<m<x[i]>m=x[i]; returnm;}main<>{ inta[]={8,7,55,23,49},max; max=array_max<a,5>; printf<"Max=%d\n",m>;}指针数组一般说明形式为:类型符*数组名[数组大小];如:int*p[5];[例7.8]指针数组的简单使用main<>{ inta[5]={1,3,5,7,9}; int*num[5],i;for<i=0;i<5;i++>num[i]=&a[i];for<i=0;i<5;i++>printf<"%d",*num[i]>;}多级指针有:inta,*p=&a;若使:q=&p;则q是就指向指针变量的指针变量,称q为二级指针。二级指针定义的一般形式为:类型符**指针变量名;如:int**q;则:a=5;或*p=5;或**q=5;结果相同。同样可以有三级、四级指针等等,我们把二级及二级以上的指针称为多级指针。[例7.9]数组的输出main<>{ inta[5]={1,3,5,7,9}; int*b[5],i,**p; for<i=0;i<5;i++> b[i]=&a[i]; p=b; for<i=0;i<5;i++> printf<"%d",**p++>;}指针与字符串字符串的表示形式char字符数组名[数组元素个数]如有: charstr[80]="China",*p=str; printf<"%s",str>;printf<"%s",p>;printf<"%s","China">;用%s输入/输出字符串时,只需要知道字符串的开始地址即可。使p指向字符串的开始地址,可写成:char*p="China";字符指针作函数参数[例7.11]将例7.10改用函数完成intStrLen<char*s>{intn=0;while<*s++>n++;returnn;}main<>{ charstr[]="abc",*p; intlen; p=str;len=StrLen<p>;printf<"%s的长度为%d\n",p,len>;}运行结果:abc的长度为3返回字符串的函数[例7.13]改写字符串复制函数char*StrCopy<char*str1,char*str2>{char*p=str1;while<<*str1=*str2>!=’\0’>{str1++;str2++;}returnp;}main<>{chars1[80],s2[]="abc";printf<"复制之后的字符串:%s\n",StrCopy<s1,s2>>;}复制之后的字符串:abc字符指针数组[例7.14]将若干字符串输出main<>{ char*str[]={"Word","Excel","Outlook"};inti; for<i=0;i<3;i++>printf<"%s\n",str[i]>;}[例7.15]使用多级指针完成若干字符串输出main<>{ char*str[]={"Word","Excel","Outlook"};char**p; for<p=str;p<str+3;p++>printf<"%s\n",*p>;}输出:WordExcelOutlook字符指针与字符数组的讨论占用的内存空间不同charstr[80]; char*p;初始化的概念不同charstr[80]="abc"; char*p="abc";数组名是常量,字符指针是变量str=str+2; /*Error*/ p=str+2; /*Ok*/字符数组有一块确定的、连续的内存单元;而指针只有一个字的内存单元。所以:charstr[80],*p;scanf<"%s",str>; /*Ok*/scanf<"%s",p>; /*error*/指针数据类型小结各种指针定义小结intx; 整型变量xint*p; 整型指针pinta[n]; a是一个整型数组,有n个元素int*p[n]; p是一个整型指针数组,有n个元素intf<>; f是一个函数,返回一个整型值int*p<>; p是一个函数,返回一个整型变量的地址int<*p><>; p为一个指针,它可以指向一个整型函数int**p; p为一个二级指针,它存储另一个指针的地址指针运算小结1、指针变量加、减一个整数,指的是移到向上或向下一个单位的地址例如:p++、p--、p+i、p-i、p+=i、p-=i等。2、指针变量赋值如有:inta,*p1,*p2,array[10],max<>,<*p3><>;则:p1=&a; /*取变量a的地址,使p1指向a*/ p2=array; /*p2指向array数组的起始地址*/ p1=&array[4]; /*p1指向array[4]元素*/ p3=max; /*p3指向max函数*/ p2=p1; /*p2的指向与p1的指向相同*/ p1=2000; /*error,类型不同*/ a=p2; /*error,类型不同*/三名主义:〔考试的重点数组名:表示第一个元素的地址。数组名不可以自加自减,它是地址常量名。函数名:表示该函数的入口地址。

字符串常量名:表示第一个字符的地址。一维数组的重要概念:

对a[10]这个数组的讨论。

1、a表示数组名,是第一个元素的地址,也就是元素a[0]的地址。

2、a是地址常量,所以只要出现a++,或者是a=a+2赋值的都是错误的。

3、a是一维数组名,所以它是列指针,也就是说a+1是跳一列。

对a[3][3]的讨论。

1、a表示数组名,是第一个元素的地址,也就是元素a[0][0]的地址。

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。

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

数组的初始化,一维和二维的,一维可以不写,二维第二个一定要写

inta[]={1,2}合法。inta[][4]={2,3,4}合法。但inta[4][]={2,3,4}非法。二维数组中的行指针

inta[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

这个思想很重要!不能对字符数组整体赋值,而字符指针允许整体赋值指针p可以p++〔后移或p--〔前移或p+i,而数组名a只能用,a+i〔注意一维数组和二维数组的区别两个地址〔指针可以比较大小,后面大前面小;可以相减表示差几个元素对字符数组或字符串的操作一般用:while<*s>或while<s[i]>或for<p=a;p<a+n;p++>{…;s++}{…;i++}注意:新生成的字符串是否有结束符’\0’10.字符串打印:chars1[10],s2[6][10],*s3;一维数组:printf<"%s",……>;二维数组:printf<"%s",……>;结构体、共用体和枚举问题:类型名,成员名,变量名问题:类型名,成员名,变量名sizeof<structstaff>的值?用变量表示worker的年份用指针p表示worker的年份6.结构类型struct[staff]{ charno[5]; charname[10]; charsex; struct {intyear;intmonth;intday;}birthday; floatwages[2];}※通过指针访问结构体变量的成员①结构变量名.成员名〔名字引用;②结构指针->成员名〔指针引用;③〔*结构指针.成员名〔将指针转化为名字引用;『结构变量占用内存情况』结构变量的各个成员分量在内存中占用连续存储区域,所占内存大小为结构中每个成员的占用内存的长度之和。联合类型〔union表示法同结构类型首地址起共用允许对第一个成员赋值共用体变量任何时刻-只有一个成员存在共用体变量定义分配内存,长度=最长成员所占字节数〔即字节数取最大的共用体变量的定义形式有三种〔类似结构体变量的定义枚举类型enumweekdays{Sun,Mon,Tue,Wed,Thu,Fri,Sat};枚举型仅适应于取值有限的数据。取值表中的值称为枚举元素,枚举元素是常量。在C编译器中,按定义的顺序取值0、1、2、...。所以枚举元素可以进行比较,比较规则是:序号大者为大。例如,上例中的Sun=0、Mon=1、……、Sat=6,所以Mon>Sun、Sat最大。枚举元素的值也是可以人为改变的:定义时由程序指定。例如,如果enumweekdays{Sun=7,Mon=1,Tue,Wed,Thu,Fri,Sat};

则Sun=7,Mon=1,从Tue=2开始,依次增1。定义别名typedeftypenewname;用户定义的类型名已有数据类型名类型定义语用户定义的类型名已有数据类型名类型定义语句关键字eg:typedefintX,Y[10],*Z;Xa;Yb;Zc;其中a,b,c各代表什么?整型变量a,整型数组b[10],整型指针变量c。第九章文件操作与位运算6个位运算符:位左移<<、位右移>>、按位取反~、位与&、位或|、位异或^。位运算题目计算是先要把十进制化成二进制,再做位运算。在没有舍去数据的时候,<<左移一位表示乘以2;>>右移一位表示除以2。所谓"文件"一般指存储在外部介质上数据的集合。按文件中数据的组织形式来分,可分为文本文件〔即ASCII码文件和二进制文件。文件操作的过程:对磁盘文件的操作必须"先打开,后读写,最后关闭"。文件的打开方式打开方式含义及说明"r"以只读方式打开一个文本文件,只允许读数据"w"以只写方式打开或建立一个文本文件,只允许写数据"a"以追加方式打开一个文本文件,并在文件末尾写数据"r+"以读写方式打开一个文本文件,允许读和写"w+"以读写方式打开或建立一个文本文件,允许读写"a+"以读写方式打开一个文本文件,允许读,或在文件末追加数据"rb"以只读方式打开一个二进制文件,只允许读数据"wb"以只写方式打开或建立一个二进制文件,只允许写数据"ab"以追加方式打开一个二进制文件,并在文件末尾写数据"rb+"以读写方式打开一个二进制文件,允许读和写"wb+"以读写方式打开或建立一个二进制文件,允许读和写"ab+"以读写方式打开一个二进制文件,允许读,或在文件末追加数据常用文件操作函数函数名功能调用举例返回值fopen打开文件文件指针名=fopen<文件名,使用文件方式>;FILE*fp;fp=fopen<"c:\\tc\\source.dat","r">;fclose〔关闭文件fclose<文件指针变量>;fclose<fp>;成功关闭返回值为0,如果关闭出错为EOF<-1>。ferror出错检测ferror<文件指针变量>;ferror<fp>;/*默认初值为零*/返回0,表示未出错;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论