1 / 13
文档名称:

浅析c语言的函数调用.doc

格式:doc   页数:13页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

浅析c语言的函数调用.doc

上传人:tmm958758 2015/10/5 文件大小:0 KB

下载得到文件列表

浅析c语言的函数调用.doc

相关文档

文档介绍

文档介绍:浅析c语言的函数调用
C语言中的函数调用形式差别在形参的不同或是返回类型的不一样,下面来谈一下这些函数。
第一种也是最简单的一种:
请看下面例子:
/*该函数实现比较两个值的大小*/
#include<>
#include <>
pare(int x,int y)
{
int z;
if(x>=y)
z=1;
else
z=0;
return z;
}
int main(void)
{
int x,y,z;
printf("please input the x and y!\n");
scanf("%d %d",&x,&y);
pare(x,y);
printf("%d\n",z);
return ESS;
}
这个函数知识简单比较x,y的值,将x,pare函数,而后返回z值。这里讲一下函数传递的两个规则:
函数之间的调用关系是传值调用的;
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,%d\n",x,y);
return ESS;
}
试运行这个程序,你会发现,打印出来的仍是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,%d\n",x,y);
return ESS;
}
这个程序时对上面程序的改进或者说是纠正,这样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 string[1000]={"Hello,my world!"};
change(string);
printf("%s\n",string);
return ESS;
}
这种就和上面的第二种情况很类似,传递给change函数的是一个指向字符数组首元素的指针的拷贝,仿佛是通过传址调用的,但