浅析c语言的函数调用.doc_第1页
浅析c语言的函数调用.doc_第2页
浅析c语言的函数调用.doc_第3页
浅析c语言的函数调用.doc_第4页
浅析c语言的函数调用.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

浅析c语言的函数调用C语言中的函数调用形式差别在形参的不同或是返回类型的不一样,下面来谈一下这些函数。第一种也是最简单的一种:请看下面例子:/*该函数实现比较两个值的大小*/ #include#include int compare(int x,int y)int z;if(x=y)z=1;elsez=0;return z; int main(void) int x,y,z; printf(please input the x and y!n); scanf(%d %d,&x,&y);z=compare(x,y);printf(%dn,z);return EXIT_SUCCESS; 这个函数知识简单比较x,y的值,将x,y传递给compare函数,而后返回z值。这里讲一下函数传递的两个规则:1、 函数之间的调用关系是传值调用的;2、对于指针或是数组名传递的参数则是传址调用的,但这第一条不矛盾。具体在下面讲。对于规则1的解释是调用程序传递的是变量或实参的一份拷贝,给被调用程序的是一份复制品,这样被调用的函数才不致于随便改动调用程序的数据(这也有例外)。下面是例子程序:/该函数原本是打算实现交换两个值的,结果实现不了!#include#include int swap(int x,int y)int temp;temp=x;x=y;y=temp; int main(void) int x,y; printf(please input the x and y!n); scanf(%d,%d,&x,&y);swap(x,y);printf(%d,%dn,x,y);return EXIT_SUCCESS;试运行这个程序,你会发现,打印出来的仍是x,y的原值,调用函数没有起到任何作用,或是说程序并没有达到你所想的效果。这就印证了刚才所说的传值是实参的一份拷贝而已!第二种是传递的参数是指针,请看下面例程:/*该函数实现两个数交换其值*/#include#include int swap(int *x,int *y)int temp;temp=*x;*x=*y;*y=temp; int main(void) int x,y;/*定义两个指针变量指向x与y*/ int *p=&x,*q=&y; printf(please input the x and y!n); scanf(%d,%d,&x,&y);/*注意这里的调用形式,必须加上这个&符号*/swap(&x,&y);printf(%d,%dn,x,y);return EXIT_SUCCESS;这个程序时对上面程序的改进或者说是纠正,这样x,y才能交换其值。可是你也许会问这时为什么呢?仅仅改变为指针形式就可以吗?是的,让我慢慢道来:这确实是刚才所说的一份拷贝,但现在拷贝的是一份指针,就是指向x,y的指针,但是通过swap函数里的却可以间接访问在主函数里的x,y的值,所以也就可以修改主函数的值了,但这时主函数的指针值确实改变不了的,因为主函数仅仅是传递了一份拷贝,任凭swap函数这么修改这份指针,始终改不了主函数的指针。现在明白了吗?第三种:传递的是数组名,请看下面的例程:/*该函数实现将某一字符串中的小写改为大写字母,其余的不变*/#include #include void change(char *string)int i=0;/*记住这种写法“*(string+i)”*/while(*(string+i)!=n)if(*(string+i)=a&*(string+i)=z)*(string+i)-=32;i+=1;int main(void) char string1000=Hello,my world!;change(string);printf(%sn,string);return EXIT_SUCCESS;这种就和上面的第二种情况很类似,传递给change函数的是一个指向字符数组首元素的指针的拷贝,仿佛是通过传址调用的,但实际上和刚才说的,尽管传递的是指针拷贝,但还是能改变主函数的数据。对于被调用函数头还可以用这种表达方式:void change(char string)。对于被调用函数的调用形式应该是程序所写的那样,而不应该写成change(char string),这样gcc环境下编译会出现这样的“taioshi.c:17: parse error before char”提示错误。顺便提一下,在change函数,出现了const关键词,这里有一个细微的表达差别:char const *string与char * const string,前者是指指针指的变量不能修改,后者则是值指针值不能修改。还有就是const char *const A,标识指针string和string指向的对象都不可变!第四种:返回类型是指针(或是叫指针函数),看下面例程#include#include #include#define MAX_SIZE 1000/*该子函数实现从某一个字符串中查找一个关键词并返回它的指针*/char *find_int(char key_value,char *array,int len)int i;for(i=0;ib)return a; else return b;main() int max(int a,int b); int(*pmax)(); int x,y,z; pmax=max; printf(input two numbers:n); scanf(%d%d,&x,&y); z=(*pmax)(x,y); printf(maxmum=%d,z);从上述程序可以看出用,函数指针变量形式调用函数的步骤如下:1) 先定义函数指针变量,如后一程序中第9行 int (*pmax)();定义 pmax为函数指针变量。2) 把被调函数的入口地址(函数名)赋予该函数指针变量,如程序中第11行 pmax=max;3) 用函数指针变量形式调用函数,如程序第14行 z=(*pmax)(x,y);4) 调用函数的一般形式为: (*指针变量名) (实参表)使用函数指针变量还应注意以下两点:a) 函数指针变量不能进行算术运算,这是与数组指针变量不同的。数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的。b) 函数调用中(*指针变量名)的两边的括号不可少,其中的*不应该理解为求值运算,在此处它只是一种表示符号。2 指针型函数 前面我们介绍过,所谓函数类型是指函数返回值的类型。在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。定义指针型函数的一般形式为: 类型说明符 *函数名(形参表) /*函数体*/ 其中函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针值所指向的数据类型。如: int *ap(int x,int y) . /*函数体*/表示ap是一个返回指针值的指针型函数,它返回的指针指向一个整型变量。【例】本程序是通过指针函数,输入一个17之间的整数,输出对应的星期名。main() int i; char *day_name(int n); printf(input Day No:n); scanf(%d,&i); if(i%sn,i,day_name(i);char *day_name(int n) static char *name= Illegal day, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday; return(n7) ? name0 : namen);本例中定义了一个指针型函数day_name,它的返回值指向一个字符串。该函数中定义了一个静态指针数组name。name数组初始化赋值为八个字符串,分别表示各个星期名及出错提示。形参n表示与星期名所对应的整数。在主函数中,把输入的整数i作为实参,在printf语句中调用day_name函数并把i值传送给形参n。day_name函数中的return语句包含一个条件表达式,n值若大于7或小于1则把name0指针返回主函数输出出错提示字符串“Illegal day”。否则返回主函数输出对应的星期名。主函数中的第7行是个条件语句,其语义是,如输入为负数(i0)则中止程序运行退出程序。exit是一个库函数,exit(1)表示发生错误后退出程序,exit(0)表示正常退出。应该特别注意的是函数指针变量和指针型函数这两者在写法和意义上的区别。如int(*p)()和int *p()是两个完全不同的量。i

温馨提示

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

评论

0/150

提交评论