C语言基础知识重点和难点.doc_第1页
C语言基础知识重点和难点.doc_第2页
C语言基础知识重点和难点.doc_第3页
C语言基础知识重点和难点.doc_第4页
C语言基础知识重点和难点.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

C语言基础知识重点和难点一、 数组1. 一维数组的定义与初始化1) 不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。例如: #define FD 5 main() int a3+2,b7+FD; 是合法的。但是下述说明方式是错误的。 main() int n=5; int an; 2) 语言对数组的初始化赋值还有以下几点规定:(1) 可以只给部分元素赋初值。当 中值的个数少于元素个数时,只 给前面部分元素赋值。例如: int a10=0,1,2,3,4;表示只给a0a45个元素赋值,而后5个元素自动赋0值。(2)只能给元素逐个赋值,不能给数组整体赋值。例如给十个元素全部赋1值,只能写为: int a10=1,1,1,1,1,1,1,1,1,1;而不能写为: int a10=1;(3)如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。例如: int a5=1,2,3,4,5;可写为: int a=1,2,3,4,5;2. 一维数组元素的引用1) 在语言中只能逐个地使用下标变量,而不能一次引用整个数组。例如,输出有10个元素的数组必须使用循环语句逐个输出各下标变量: for(i=0; i2!16. 字符数组的初始化1) 字符数组也允许在定义时作初始化赋值。例如: char c10=c, , p, r, o, g, r, a,m;赋值后各元素的值为: 数组C c0的值为cc1的值为 c2的值为p c3的值为rc4的值为0c5的值为gc6的值为rc7的值为ac8的值为m其中c9未赋值,由的值为p系统自动赋予0值。当对全体元素赋初值时也可以省去长度说明。例如: char c=c, ,p,r,o,g,r,a,m;这时C数组的长度自动定为9。在语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。前面介绍字符串常量时,已说明字符串总是以0作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符0存入数组,并以此作为该字符串是否结束的标志。有了0标志后,就不必再用字符数组的长度来判断字符串的长度了。2) 语言允许用字符串的方式对数组作初始化赋值。例如: char c=c, ,p,r,o,g,r,a,m;可写为: char c=C program; 或去掉写为: char c=C program;用字符串方式赋值比用字符逐个赋值要多占一个字节, 用于存放字符串结束标志0。上面的数组c在内存中的实际存放情况为:Cprogram0 0是由C编译系统自动加上的。由于采用了0标志,所以在用字符串赋初值时一般无须指定数组的长度, 而由系统自行处理。7. 字符串处理函数用于输入输出的字符串函数,在使用前应包含头文件stdio.h,使用其它字符串函数则应包含头文件string.h。1) 输出函数 puts2) 输入函数gets:gets读入字符串时,可以读入其中的空格,直到回车。而用scanf读入字符串时,遇到空格即停止。3) 连接函数strcat:格式为strcat (字符数组名1,字符数组名2),一定注意,字符数组1一定要足够大,否则将越界。4) 拷贝函数strcpy:格式为strcpy (字符数组名1,字符数组名2)。注意,字符数组赋值,不能用等于号,而要用strcpy函数5) 比较函数strcmp:格式为strcmp(字符数组名1,字符数组名2)。注意,字符数组的比较不能用大于、小于号比较。测字符串长度函数strlen:测字符串的实际长度(不含字符串结束标志0) 并作为函数返回值。二、 函数1. 形式参数和实际参数函数的形参和实参具有以下特点:1) 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。2) 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使实参获得确定值。3) 实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配”的错误。4) 函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。下例可以说明这个问题。int s(int n) int i; for(i=n-1;i=1;i-) n=n+i; printf(n=%dn,n);main() int n; printf(input numbern); scanf(%d,&n); s(n); printf(n=%dn,n);2. 数组作为函数参数1) 数组元素作函数实参数组元素就是下标变量,它与普通变量并无区别。 因此它作为函数实参使用与普通变量是完全相同的,在发生函数调用时,把作为实参的数组元素的值传送给形参,实现单向的值传送。2) 数组名作为函数参数数组名作函数参数时所进行的传送只是地址的传送,也就是说把实参数组的首地址赋予形参数组名。形参数组名取得该首地址之后,也就等于有了实在的数组。实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。上图说明了这种情形。图中设a为实参数组,类型为整型。a占有以2000为首地址的一块内存区。b为形参数组名。当发生函数调用时,进行地址传送,把实参数组a的首地址传送给形参数组名b,于是b也取得该地址2000。于是a,b两数组共同占有以2000为首地址的一段连续内存单元。从图中还可以看出a和b下标相同的元素实际上也占相同的两个内存单元(整型数组每个元素占二字节)。例如a0和b0都占用2000和2001单元,当然a0等于b0。类推则有ai等于bi。例1:判别一个整数数组中各元素的值,若大于0 则输出该值,若小于等于0则输出0值。编程如下:void nzp(int a5) int i; printf(nvalues of array aare:n); for(i=0;i5;i+) if(ai0)ai=0; printf(%d ,ai); main() int b5,i; printf(ninput 5 numbers:n); for(i=0;i5;i+) scanf(%d,&bi); printf(initial values of array b are:n); for(i=0;i5;i+) printf(%d ,bi); nzp(b); printf(nlast values of array b are:n); for(i=0;i5;i+) printf(%d ,bi);3) 用数组名作为函数参数时应注意以下几点:i. 形参数组和实参数组的类型必须一致,否则将引起错误。ii. 形参数组和实参数组的长度可以不相同,因为在调用时,只传送首地址而不检查形参数组的长度。当形参数组的长度与实参数组不一致时,虽不至于出现语法错误(编译能通过),但程序执行结果将与实际不符,这是应予以注意的。iii. 在函数形参表中,允许不给出形参数组的长度,或用一个变量来表示数组元素的个数。例如,可以写为:void nzp(int a)或写为void nzp(int a,int n)其中形参数组a没有给出长度,而由n值动态地表示数组的长度。n的值由主调函数的实参进行传送。例1可改为例2的形式。例2:void nzp(int a,int n) int i; printf(nvalues of array a are:n); for(i=0;in;i+) if(ai0) ai=0;printf(%d ,ai); main() int b5,i; printf(ninput 5 numbers:n); for(i=0;i5;i+) scanf(%d,&bi); printf(initial values of array b are:n); for(i=0;i5;i+) printf(%d ,bi); nzp(b,5); printf(nlast values of array b are:n); for(i=0;ib?a:b; return(c);main()int a=8; printf(%dn,max(a,b);3) 静态局部变量i. 静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储空间,函数调用结束后即释放。ii. 静态局部变量在编译时赋初值,即只赋初值一次;而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。iii. 如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。例2:打印1到5的阶乘值。int fac(int n)static int f=1; f=f*n; return(f);main()int i; for(i=1;iy?x:y; return(z);main()extern A,B; printf(%dn,max(A,B);int A=13,B=-8;说明:在本程序文件的最后1行定义了外部变量A,B,但由于外部变量定义的位置在函数main之后,因此本来在main函数中不能引用外部变量A,B。现在我们在main函数中用extern对A和B进行“外部变量声明”,就可以从“声明”处起,合法地使用该外部变量A和B。C语言的42个运算符及15个优先级一、赋值运算符 赋值语句的作用是把某个常量或变量或表达式的值赋值给另一个变量。符号为=。这里并不是等于的意思,只是赋值,等于用=表示。 注意:赋值语句左边的变量在程序的其他地方必须要声明。 得已赋值的变量我们称为左值,因为它们出现在赋值语句的左边;产生值的表达式我们称为右值,因为她它们出现在赋值语句的右边。常数只能作为右值。 例如: count=5; total1=total2=0; 第一个赋值语句大家都能理解。 第二个赋值语句的意思是把0同时赋值给两个变量。这是因为赋值语句是从右向左运算的,也就是说从右端开始计算。这样它先total2=0;然后total1=total2;那么我们这样行不行呢? (total1=total2)=0; 这样是不可以的,因为先要算括号里面的,这时total1=total2是一个表达式,而赋值语句的左边是不允许表达式存在的。二、算术运算符 在C语言中有两个单目和五个双目运算符。 符号 功能 + 单目正 - 单目负 * 乘法 / 除法 % 取模 + 加法 - 减法 下面是一些赋值语句的例子, 在赋值运算符右侧的表达式中就使用了上面的算术运算符: Area=Height*Width; num=num1+num2/num3-num4; 运算符也有个运算顺序问题,先算乘除再算加减。单目正和单目负最先运算。 取模运算符(%)用于计算两个整数相除所得的余数。例如: a=7%4; 最终a的结果是3,因为7%4的余数是3。 那么有人要问了,我要想求它们的商怎么办呢? b=7/4; 这样b就是它们的商了,应该是1。 也许有人就不明白了,7/4应该是1.75,怎么会是1呢?这里需要说明的是,当两个整数相除时,所得到的结果仍然是整数,没有小数部分。要想也得到小数部分,可以这样写7.0/4或者7/4.0,也即把其中一个数变为非整数。 那么怎样由一个实数得到它的整数部分呢?这就需要用强制类型转换了。例如: a=(int) (7.0/4); 因为7.0/4的值为1.75,如果在前面加上(int)就表示把结果强制转换成整型,这就得到了1。那么思考一下a=(float) (7/4);最终a的结果是多少? 单目减运算符相当于取相反值,若是正值就变为负值,若是负数就变为正值。 单目加运算符没有意义,纯粹是和单目减构成一对用的。三、逻辑运算符 逻辑运算符是根据表达式的值来返回真值或是假值。其实在C语言中没有所谓的真值和假值,只是认为非0为真值,0为假值。 符号 功能 & 逻辑与 | 逻辑或 ! 逻辑非 例如: 5!3; 0|-2&5; !4;当表达式进行&运算时,只要有一个为假,总的表达式就为假,只有当所有都为真时,总的式子才为真。当表达式进行|运算时,只要有一个为真,总的值就为真,只有当所有的都为假时,总的式子才为假。逻辑非(!)运算是把相应的变量数据转换为相应的真/假值。若原先为假,则逻辑非以后为真,若原先为真,则逻辑非以后为假。 还有一点很重要,当一个逻辑表达式的后一部分的取值不会影响整个表达式的值时,后一部分就不会进行运算了。例如: a=2,b=1; a|b-1; 因为a=2,为真值,所以不管b-1是不是真值,总的表达式一定为真值,这时后面的表达式就不会再计算了。四、关系运算符 关系运算符是对两个表达式进行比较,返回一个真/假值。 符号 功能 大于 = 大于等于 = 右移赋值 &= 位逻辑与赋值 |= 位逻辑或赋值 = 位逻辑异或赋值 上面的十个复合赋值运算符中,后面五个我们到以后位运算时再说明。 那么看了上面的复合赋值运算符,有人就会问,到底Total=Total+3;与Total+=3;有没有区别?答案是有的,对于A=A+1,表达式A被计算了两次,对于复合运算符A+=1,表达式A仅计算了一次。一般的来说,这种区别对于程序的运行没有多大影响,但是当表达式作为函数的返回值时,函数就被调用了两次(以后再说明),而且如果使用普通的赋值运算符,也会加大程序的开销,使效率降低。七、条件运算符 条件运算符(?:)是C语言中唯一的一个三目运算符,它是对第一个表达式作真/假检测,然后根据结果返回两外两个表达式中的一个。 ?: 在运算中,首先对第一个表达式进行检验,如果为真,则返回表达式2的值;如果为假,则返回表达式3的值。 例如: a=(b0)?b:-b; 当b0时,a=b;当b不大于

温馨提示

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

评论

0/150

提交评论