




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、13.1 对函数的深入谈论 一. main函数的参数 main函数是C语言的主函数,是整个程序的入口,每 个C程序有且只有一个main函数。在此之前我们学过C程 序中,main函数括号里是空的,没有任何参数。在本节中, 我们学习带参数的main函数。main函数通常由两个参数, 其定义形式如下: main(int argc, char *argv) argc和argv是main函数的两个参数,其名 称可以编程人员自行确定,但是每个参数 的类型是C语言规定好了的。第一个参数必 须是整型;第二个参数必须是字符串的指 针,也就是char类型的二维指针。第二个参 数也可以定义为char *agrv。
2、在C语言中,main函数是程序的入口,在一 般情况下,没有其它的函数来调用main函 数,那么main函数的参数有什么中用呢? 我们对包含以上主函数的、名为myc的文件进行 编译连接,生成名为myc.exe的可执行文件后, 即可在dos下输入命令执行该程序: myc 这就是命令行,myc即为执行程序的命令。这时 argc中的值为1,argv0中将存放字符串“myc” 的首地址,即指向字符串“myc”。如输入: myc OK! GOOD 在此命令行中OK!和GOOD称为命令行参数。这 时argc的值为3,也就是argc里存放的是字符串的 个数,argv里存放的如下图所示。 argvargv0 a
3、rgv1 argv2 0 myc OK! GOOD argv0、argv1、argv2分别指向字符 串”myc”、”OK!”、“GOOD”。其中,为 了执行程序,字符串argv0必不可少, argc值为3。从argv1开始都是可选的命令 参数。另外,按标准规定,argvargc由系 统置0。 命令行中,各参数之间用空格符或TAB符隔 开,空格不作为参数的内容。若要把空格 也作为参数的内容,应该把字符串放在一 对双引号内。 例13.1 若以下程序放在myc.c文件中,在编译连接后,生成一个 myc.exe文件 ,输入argc和argv中的数据。 #include”stdio.h” main(in
4、t argc, char *argv) int i; printf(“argc=%dn”,argc); for(i=1;iargc;i+) printf(“%s”,argvi); printf(“n”); 若在命令中输入: myc A COMMAND LINE 程序将输出: argc=4 A COMMAND LINE 在C语言中,函数名代表的是一个函数的入 口地址,因此可以定义一个指针指向该入 口地址,即指向函数的指针。 指向函数的指针变量定义格式如下: 函数返回值类型(*指针名)(函数参数列 表); 例13.2 以下程序使用函数指针调用函数 int fun(int a, int *b) ma
5、in() int (*pfun)(int, int*), a, b, s; /*此处定义了pfun这个函数指 针*/ pfun=fun; /*将函数名fun赋给指针pfun,即让pfun指向 fun*/ s=(*pfun)(a, /*此处通过pfun指针来调用fun函数,相当于调用 s=fun(a, main() fun(6); 答案:136 一. 宏 1. 不带参数的宏 定义形式如下: #define 宏名 替换文本 或 #define 宏名 例13.4 #define PI 3.1415926 (1)宏名一般习惯用大写字母表示,以便与变量名 相区别。这只是建议,宏名也可以使用小写字母。 (
6、2)宏定义行的替换文本中还可以包含已经定义过 的宏名。 如:例13.5 #define PI 3.1415926 #define ADDPI (PI+1) #define TWO_ADDPI (2*ADDPI) (3)在宏展开时,C语言仅仅使用替换文本替换宏 名,而不是使用计算的结果进行替换。 (4)宏定义时,如一行写不下,可以在行末尾加反 斜线“”,然后在第二行接着再写。 (5)同一宏名不能重复定义,除非两个宏定 义命令行完全一致。 (6)宏展开时,不能替换双引号中与宏名相 同的字符串。 (7)宏定义的有效范围为定义点到文件结束, 还可以用#undef提前终止已经定义的宏。 带参数的宏,即宏
7、名后带有参数列表的宏 定义为一个带参数的宏。在进行宏展开时, 用表达式替换该宏名,同时用实参代替宏 名后的形参。 例13.6 #define MAX(x,y) (xy ? x:y) max=MAX(10,5); 宏展开后,赋值语句为:max=(105 ? 10:5); (1)在替换带参数的宏名时,一对圆括号不 能少,圆括号中实参的个数应该与形参的 个数相同,如有多个参数,各参数用逗号 隔开。 (2)与不带参数的宏相同,同一个宏名不能 重复定义,除非两个宏定义命令行完全一 致。 (3)在宏替换行的表达式中的形参和整个表 达式应该用括号括起来。 例13.7 #define MUL(a,b) (a)
8、*(b) m=MUL(10-5, 5+1)/2; 结果输出m=_。 答案:15 (4)带参数的宏与函数的异同:定义时都有形参, 不过宏定义时形参不能指定类型。在调用时都需 要传递实参,不同的是宏替换时对参数没有类型 要求。另外,宏替换是在编译时由预处理程序完 成的,因此宏替换不占运行时间;二函数的调用 是在程序运行中处理的,临时给分配存储单元, 在函数调用过程中还需要占用一系列的处理时间。 “文件包含”处理,指的是一个源文件可以将另外 一个源文件的全部内容包含进来,也就是将其他 源文件包含到本文件中来。这样做的好处是,我 们可以把程序中不同功能的模块分别放到不同的 文件中,这样,如果需要那部分
9、功能,就把定义 该功能模块的文件包含到本文件中。C语言用 #include命令等来实现文件的包含功能。#include 命令行的形式如下: #include “文件名” 或 #include (1)#include命令行通常书写在文件的开头,故有 时也把包含文件称作“头文件”。 (2)包含文件中,一般包含一些公用的#define命 令行、外部说明或函数的原型说明。 (3)当包含文件修改后,对包含该文件的源程序必 须重新进行编译连接。 (4)在一个程序中,允许有任意多个#include命令 行。 ()在包含文件中还可以包含其他文件。 例13.8 下面程序由两个源程序文件14.h和14.c组成,程
10、序编译运行的 结果是_。 14.h 的源程序为: #define N 10 #define f2(x) (x*N) 14.c的源程序为: #include #define M 8 #define f(x) (x)*M) #include “14.h” main() int i, j; i=f(1+1); j=f2(1+1); printf(“%d %dn”,i, j); 答案:16 11 一. 存储分类 根据变量在内存的不同位置,可以将变 量分为两类:自动类和静态类。 根据程序中变量定义的位置不同,又可 以将变量分为局部变量和全局变量。在函 数外部定义的变量是全局变量。局部变量 是内部变量,全
11、局变量也称为外部变量。 局部变量可以是自动类变量,也可以是 静态类变量。全局变量只能是静态类变量。 C语言提供了与此相关的4个关键字:auto (自动)、register(寄存器)、static(静 态)、extern(外部)。它们可以放在类型 名的左边,也可以放在类型名的右边。例 如: auto int a; 或 int auto a; 局部变量有3种类型:auto、register和 static。 1. auto变量 在定义变量时,如果没有指定相应的存 储类型,则系统默认该存储类型为auto类型。 当程序进入定义该变量的函数或复合语句 时,系统为这些变量临时分配内存单元。 当程序离开这个
12、函数或复合语句时,系统 将销毁这些内存单元,使其数据不再有效。 例13.9 以下程序的输出结果是_。 main() int i=1, i_sum; float f, f_sum; int i; i=10; printf(“(1)i=%dn”,i); printf(“(2)i=%dn”,i); 答案(1)i=10 (2)i=1 register变量(寄存器变量)与auto变量一样, 是自动类变量,其作用域和生存期与auto变 量完全一样。register变量与auto变量唯一 的区别是auto变量在内存中分配存储空间, 而register变量在CPU的寄存器中分配。 寄存器运算速度非常的快,但寄
13、存器数量 有限,一般情况下,不建议编程人员使用 寄存器变量。 在函数内部或复合函数语句中定义变量时,如果 使用static来说明,就构成了静态局部变量。静态 局部变量的作用域与auto和register类型变量一样, 但其生存期却完全不一样。 静态局部变量在内存的静态存储区占据着永久性 的存储单元,即使离开定义该变量的函数(或复 合语句),该存储单元也不会被销毁。当下次再 进行定义该变量的函数(或复合语句)时,存储 单元仍然保存着原来的值。 例13.10 以下程序运行后的输出结果是_。 fun(int a) int b=0; static int c=3; b+; c+; return (a+
14、b+c); main() int i, a=5; for(i=0;i3;i+) printf(“ %d %d ”,i, fun(a); printf(“n”); 答案:0 10 1 11 2 12 在外部任意位置定义的变量,称为全局变量。全局变量都是静态变量,其作用域从定 义的位置开始,到整个源文件结束为止。 例13.11 以下程序的运行结果是_。 int sum; int fun1() sum+=20; int a; int fun2() a=20; sum+=a; main() sum=0; fun1(); a=8; fun2(); printf(“sum=%d a=%d”, sum, a
15、); 答案:sum=40 a=20 一. malloc函数 malloc函数用于分配内存空间。ANSI C标准规定 malloc函数返回值的类型为void*,该函数的调用形 式为: malloc(size) 其中参数size的类型为unsigned int,表示需要分配 的内存的字节数。如果系统有足够的内存可供分配, 函数返回一个指向有size个字节的存储区首地址, 该首地址的基类型为void类型;若没有足够的内存 单元可供分配,函数返回空值(NULL)。 例13.12 malloc函数的应用 int *p; float *q; p=(int*)malloc(4); q=(float*)mal
16、loc(4); if(p!=NULL) *p=6; If(q!=NULL) *q=3.8; 动态分配存储单元 p 6 q 3.8 动态分配得到的内存单元没有名字,只能 通过指针变量来引用它。一旦指针变量的 值发生改变,原存储单元及所存数据都将 无法再引用。通过调用malloc函数所分配的 动态存储单元中没有确定的初值。 在调用malloc进行存储分配时,如果不能确 定数据类型所占字节数,可以调用sizeof运 算符来求得。如上例可以改为: p=(int *)malloc(sizeof(int); q=(float *)malloc(sizeof(float); 这是一种常用的方式,它由系统来计
17、算数 据类型的字节数。 通过静态存储分配的变量和数组,在生存期后, 或者程序运行结束后,所占用的存储单元会由系 统自动释放。但是,动态存储分配的内存单元, 必须由程序员手动进行释放。如果没有对其进行 释放,则内存单元会一致被占用,从而无法被系 统重新分配。我们可以使用free函数释放动态分 配的内存单元。free函数的调用形式如下: free(p); 这里指针p必须指向由动态分配函数(如malloc) 分配的地址。free函数将指针p所指向的空间释放, 使部分空间可以由系统重新支配。此函数没有返 回值。 通常情况下,malloc函数用于分配单个数据类型 的存储单元,但是有时候根据需求可能要分配
18、多 个同一类型的连续的存储空间。ANSI C提供了 calloc用于此功能的实现,calloc函数的返回值是 基类型为void的指针。calloc函数的调用形式: calloc(n,size); 其中参数n和size的类型都是unsigned int。calloc 函数用来给n个同一类型的数据项分配连续的存储 空间,其中每个数据项的长度为size个字节。若 分配成功,函数返回存储空间的首地址;否则返 回空值。由calloc函数分配的存储单元,系统自动 置初值为0。 例13.13 int *pint; pint=(int *)calloc(10,sizeof(int); free(pint); 程序调用calloc函数在内存中分配了10个连 续的int类型的存储空间,由pint 指向存储
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年保安证考试活动试题及答案
- 保安证考试核心竞争力题及答案
- 2025年保安证考试自信备考试题及答案
- 房地产项目开发可行性分析
- 实际案例分析保安证试题及答案
- 2025年湖南省长沙市重点中学高三入学调研物理试题(4)试卷含解析
- 重庆市开县陈家中学2024-2025学年高三下学期阶段调研(二)化学试题含解析
- 2024-2025学年广东省紫金县高三周考语文试题二含解析
- 郑州智能科技职业学院《建筑设计原理及设计》2023-2024学年第二学期期末试卷
- 江西省师大附中2025年高三下学期第二次调研(模拟)考试语文试题试卷含解析
- 2024-2025学年第二学期天域全国名校协作体高三3月联考 语文试卷(含答案)
- 2025年安徽国防科技职业学院单招综合素质考试题库带答案
- 江苏省职教联盟2024-2025学年高二上学期校际联考期中调研测试语文卷(原卷版)
- 2025湘美版(2024)小学美术一年级下册教学设计(附目录)
- 2025年广东省中考物理模拟试卷一(含答案)
- 异位妊娠妇产科护理学讲解
- 2025年度智慧养老服务平台开发与运营服务合同
- 2025年江苏农林职业技术学院高职单招职业适应性测试近5年常考版参考题库含答案解析
- GB/T 5267.5-2024紧固件表面处理第5部分:热扩散渗锌层
- 2024成人肥胖食养指南(完整版)
- 2024年上海外服招聘笔试参考题库附带答案详解
评论
0/150
提交评论