C语言中的函数调用形式差别在形参的不同或是返回类型的不一样,下面来谈一下这些函数。
第一种也是最简单的一种:
请看下面例子:(该函数实现比较两个值的大小)
#include<stdio.h>
#include
int
{
int
if(x>=y)
z=1;
else
z=0;
return
}
{
z=compare(x,y);
printf("%d\n",z);
return
}
1、函数之间的调用关系是传值调用的;
2、对于指针或是数组名传递的参数则是传址调用的,但这第一条不矛盾。具体在下面讲。
对于规则1的解释是调用程序传递的是变量或实参的一份拷贝,给被调用程序的是一份复制品,这样被调用的函数才不致于随便改动调用程序的数据(这也有例外)。
下面是例子程序:(该函数原本是打算实现交换两个值的,结果实现不了!)
#include<stdio.h>
#include
int
{
int
temp=x;
x=y;
y=temp;
}
{
swap(x,y);
printf("%d,%d\n",x,y);
return
}
试运行这个程序,你会发现,打印出来的仍是x,y的原值,调用函数没有起到任何作用,或是说程序并没有达到你所想的效果。这就印证了刚才所说的传值是实参的一份拷贝而已!
第二种是传递的参数是指针,请看下面例程:(该函数实现两个数交换其值)
#include<stdio.h>
#include
int
{
int
temp=*x;
*x=*y;
*y=temp;
}
{
swap(&x,&y);//注意这里的调用形式,必须加上这个"&"符号
printf("%d,%d\n",x,y);
return
}
这个程序时对上面程序的改进或者说是纠正,这样x,y才能交换其值。可是你也许会问这时为什么呢?仅仅改变为指针形式就可以吗?是的,让我慢慢道来:这确实是刚才所说的一份拷贝,但现在拷贝的是一份指针,就是指向x,y的指针,但是通过swap函数里的却可以间接访问在主函数里的x,y的值,所以也就可以修改主函数的值了,但这时主函数的指针值确实改变不了的,因为主函数仅仅是传递了一份拷贝,任凭swap函数这么修改这份指针,始终改不了主函数的指针。现在明白了吗?
第三种:传递的是数组名,请看下面的例程:(该函数实现将某一字符串中的小写改为大写字母,其余的不变 )
#include
#include
void
{
int
while(*(string+i)!='\n')//记住这种写法“*(string+i)”
{
if(*(string+i)>='a'&&*(string+i)<='z')
*(string+i)-=32;
i+=1;
}
}
int
{
change(string);
printf("%s\n",string);
return
}
这种就和上面的第二种情况很类似,传递给change函数的是一个指向字符数组首元素的指针的拷贝,仿佛是通过传址调用的,但实际上和刚才说的,尽管传递的是指针拷贝,但还是能改变主函数的数据。对于被调用函数头还可以用这种表达方式:void
第四种:返回类型是指针(或是叫指针函数),看下面例程
#include<stdio.h>
#include
#include<string.h>
#define
//该子函数实现从某一个字符串中查找一个关键词并返回它的指针
char
{
int
for(i=0;i<len;i++)
if(array[i]==key_value)
return
return
}
int
{
char
char
int
scanf("%c",&key_value);
printf("please
scanf("%s",array);
len=strlen(array);//计算该字符串的长度
return
}
通过以上函数可以看到返回类型有很多种,这算是比较复杂的一种了。当返回一个指针时,需要在被调用的函数前加上“*”,同时返回一个地址或是空指针。
有时你会被要求修改一个字符串,然后返回该字符串,这时可能你会用这种方式返回一个修改后的指针,但是请记住刚才提到的规则后你就会用正确的方法来解决这类问题了!
参考书籍:《c与指针》
以下附上从百度知道里摘的一篇关于指针函数与函数指针论述不错的帖子:
(网址:http://zhidao.baidu.com/question/264795890.html)
1
函数指针变量定义的一般形式为:
类型说明符
其中“类型说明符”表示被指函数的返回值的类型。“(*
例如:
表示pf是一个指向函数入口的指针变量,该函数的返回值(函数值)是整型。
【例】本例用来说明用指针形式实现对函数调用的方法。
int
}
main(){
}
从上述程序可以看出用,函数指针变量形式调用函数的步骤如下:
1)
2)
3)
4)
使用函数指针变量还应注意以下两点:
a)
b)
2
定义指针型函数的一般形式为:
其中函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针值所指向的数据类型。
如:
}
表示ap是一个返回指针值的指针型函数,它返回的指针指向一个整型变量。
【例】本程序是通过指针函数,输入一个1~7之间的整数,输出对应的星期名。
main(){
}
char
}
本例中定义了一个指针型函数day_name,它的返回值指向一个字符串。该函数中定义了一个静态指针数组name。name数组初始化赋值为八个字符串,分别表示各个星期名及出错提示。形参n表示与星期名所对应的整数。在主函数中,把输入的整数i作为实参,在printf语句中调用day_name函数并把i值传送给形参n。day_name函数中的return语句包含一个条件表达式,n值若大于7或小于1则把name[0]指针返回主函数输出出错提示字符串“Illegal
应该特别注意的是函数指针变量和指针型函数这两者在写法和意义上的区别。如int(*p)()和int
int
int
对于指针型函数定义,int