浅析c语言的函数调用

上传人:宝路 文档编号:23505723 上传时间:2017-12-01 格式:DOC 页数:13 大小:48.06KB
返回 下载 相关 举报
浅析c语言的函数调用_第1页
第1页 / 共13页
浅析c语言的函数调用_第2页
第2页 / 共13页
浅析c语言的函数调用_第3页
第3页 / 共13页
浅析c语言的函数调用_第4页
第4页 / 共13页
浅析c语言的函数调用_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《浅析c语言的函数调用》由会员分享,可在线阅读,更多相关《浅析c语言的函数调用(13页珍藏版)》请在金锄头文库上搜索。

1、浅析 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;这个函数知识简单

2、比较 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)

3、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;

4、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 的指针,但是通

5、过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)#incl

6、ude #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);从上述程序

7、可以看出用,函数指针变量形式调用函数的步骤如下:1) 先定义函数指针变量,如后一程序中第9行 int (*pmax)();定义 pmax 为函数指针变量。2) 把被调函数的入口地址(函数名)赋予该函数指针变量,如程序中第11行 pmax=max;3) 用函数指针变量形式调用函数,如程序第14行 z=(*pmax)(x,y);4) 调用函数的一般形式为:(*指针变量名) (实参表)使用函数指针变量还应注意以下两点:a) 函数指针变量不能进行算术运算,这是与数组指针变量不同的。数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的。b) 函数调用中(*指针变量名

8、)的两边的括号不可少,其中的*不应该理解为求值运算,在此处它只是一种表示符号。2 指针型函数前面我们介绍过,所谓函数类型是指函数返回值的类型。在 C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。定义指针型函数的一般形式为:类型说明符 *函数名(形参表) /*函数体*/ 其中函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针值所指向的数据类型。如:int *ap(int x,int y). /*函数体*/表示 ap 是一个返回指针值的指针型函数,它返回的指针指向一个整型变量。【例】本程序是通过指针函数,输入一个17之

9、间的整数,输出对应的星期名。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,它的返回值指向一个字符串。该函数中定义了一个静态指针数组 nam

10、e。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()是两个完全不同的量。int (*p)()是一个变量说明,说明 p 是一个指向函数入口的指针变量,该函数的返回值是整型量,(*p)的两边的括号不能少。int *p()则不是变量说明而是函数说明,说明 p 是一个指针型函数,其返回值是一个指向整型量的指针,*p 两边没有括号。作为函数说明,在括号内最好写入形式参数,这样便于与变量说明区别。对于指针型函数定义,int *p()只是函数头部分,一般还应该有函数体部分。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号