c语言基础知识重点和难点_第1页
c语言基础知识重点和难点_第2页
c语言基础知识重点和难点_第3页
c语言基础知识重点和难点_第4页
c语言基础知识重点和难点_第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!1 6. 字符数组的初始化 1) 字符数组也允许在定义时作初始化赋值。 例如: char c10=c, , p, r, o, g, r, a,m; 赋值后各元素的值为: 数组 C c0的值为c c1的值为 c2的值为p c3的值为r c4的值为0 c5的值为g c6的值为r c7的值为a c8的值为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; 可以只对部分元素赋初值,未赋初值的元素自动取 0 值 如对全部元素赋初值,则第一维的长度可以不给出,但第 二维的长度必须给出。 注意,a 数组的下标范围为 a00到 a12,所以 A、B、C 均错误。 C 语言中,数组下标可以是表达式,并且,true 是 1,false 是 0,所以选项 D 实际上是 a00 可写为: char c=“C program“; 或去掉写为: char c=“C program“; 用字符串方式赋值比用字符逐个赋值要多占一个字节, 用于存放字符串结束标志 0。上面的数组 c 在内存中的实际存放情况为: C p r o g r a m 0 0是由 C 编译系统自动加上的。由于采用了 0标志,所以在用字符串赋初值时一 般无须指定数组的长度, 而由系统自行处理。 7. 字符串处理函数 用于输入输出的字符串函数,在使用前应包含头文件“stdio.h“,使用其它字符串函数则 应包含头文件“string.h“ 。 1) 输出函数 puts 2) 输入函数 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“, 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;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 为假值。 符号 功能 0|-2 !4; 当表达式进行 a|b-1; 因为 a=2,为真值,所以不管 b-1 是不是真值,总的表达式一定为真值,这时后面的 表达式就不会再计算了。 四、关系运算符 关系运算符是对两个表达式进行比较,返回一个真/假值。 符号 功能 大于 = 大于等于 = 右移赋值 与 Total+=3;有 没有区别?答案是有的,对于 A=A+1,表达式 A 被 计算了两次,对于复合运算符 A+=1,表达式 A 仅计算了一次。一般的来说,这种区别 对于程序的运行没有多大影响,但是当表达式作为函数的返回值时,函数就 被调用了两次(以后再说明) ,而且如果使用普通的赋值运算符,也会加大程序的开销,使 效率降低。 七、条件运算符 条件运算符(?:)是 C 语言中唯一的一个三目运算符,它是对第一个表达式作真/假检测, 然后根据结果返回两外两个表达式中的一个。 ?: 在运算中,首先对第一个表达式进行检验,如果为真,则返回表达式 2 的值;如果为 假,则返回表达式 3 的值。 例如: a=(b0)?b:-b; 当 b0 时, a=b;当 b 不大于 0 时,a=-b;这就是条件表达式。其实上面的意思就 是把 b 的绝对值赋值给 a。 八、逗号运算符 在 C 语言中,多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算, 但整个表达式的值是最后一个表达式的值。 假设 b=2,c=7,d=5, a1=(+b,c-,d+3); a2=+b,c-,d+3; 对于第一行代码,有三个表达式,用逗号分开,所以最终的值应该是最后一个表达式的值, 也就是 d+3,为 8,所以 a=8。对于第二行代码,那么也是有三个表 达式,这时的三个表达式为 a2=+b、c-、d+3,(这是因为赋值运算符比逗号运算符优 先级高)所以最终表达式的值虽然也为 8,但 a2=3。 还有其他的如位逻辑运算符,位移运算符等等,我们等到讲位运算时再说明。 九、优先级和结合性 从上面的逗号运算符那个例子可以看出,这些运算符计算时都有一定

温馨提示

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

评论

0/150

提交评论