函数调用方法就这几种
1、直接调用,这种函数一般没有返回值,或者不需要返回值
如 printf("你好,可以直接调用printf函数的!")
2、表达式调用,比如对于用户写的一个求最大值函数int max(int a,int b),一般有返回值
如 c=max(6,9) 也就是要用一个量来接收函数返回来的值。
3、参数调用,同样对于上面的max
如:c=max(max(4,6),8) 这里面的一个max函数相当于又作了前面那个max函数的第一个参数
至于编写函数那你根据情况是不需要返回值,直接处理掉,如1 还是提供给别人一个返回值,给了别人,让别人用,如2 3
main()中的extem a;改为extem int a; extem用于将用于将其他源文件的函数或变量的作用范围扩大到整个程序。在定义是不需要,只有在应用前用申明语句申明即可,如extern void print(int n);
你也没说哪不懂,只能回答这么多了,希望对你有帮助
函数分为库函数和自定义函数,在调用库函数时只要标明头文件(所谓头文件就是一个东西,里面包括了一些函数各声明之类的,当你要调用它中的函数时就就得先向程序说明你要调用这个文件里的函数,否则有有侵权行为哦)可以在主调函数中调用这个头文件里的所有函数了,例如头文件为#include<stdioh>你就可以在主调函数中调用这个头文件里的函数:
main
{ printf("haha");/这时main函数为主调函数,printf为被调函数/
}
调用自定义函数时其实和调用库函数一样的,只不过这个函数是你自己定义的,再如:
main
{ void f();/声明 f()函数/
f(); /调用f()函数/
}
f()
{
printf("haha");/f()函数调用库函数/
}
本程序已在Visual Studio 2008调试通过
#include "stdioh"
int fun(int a[])//子函数中查找100~999之间的水仙花数
{int m,x,y,z,i=0;
for(m=100;m<999;m++)
{x=m%10;//分解出个位数
y=(m-x)/10%10;//分解出十位数
z=m/100;//分解出百位数
if(xxx+yyy+zzz==m)//判断每位数的立方的和是否与原数相等
{a[i]=m;i++;}}//若相等则存入数组
return(i);//返回数组中水仙花数的个数以方便在主函数中输出
}
void main()
{int fun(int a[]);//子函数先定义后使用
int a[20],i,k;
k=fun(a);//调用子函数,注意本题中传递的是整个数组,所以子函数和主函数共用一个数组,系统分配的是同一片区域,双向传递
for(i=0;i<k;i++)//循环输出
printf("%d=%d^3+%d^3+%d^3\n",a[i],a[i]/100,a[i]/10%10,a[i]%10);
}//输出结果为 153=1^3+5^3+3^3 370=3^3+7^3+0^3 371=3^3+7^3+1^3 407=4^3+0^3+7^3
你看一下如果还有什么问题再问我
1、原因很简单,max2不输出的原因是,你的函数最后只是返回了i或者j的值,但没有其它 *** 作了。
如果你想要max2输出,那么要将30行换成:
printf("%d",max2(a,b));
max2(a,b)最终得到只是个值,你完全可以把它看成是一个变量。如果这段代码还要详细点:
int s;s=max2(a,b);
printf("%d",s);
这下看明白了吧
2、有返回值和没返回值其实很好区分,只要有你最终是否会用到return去得到一个值就是区分的方法。
3、你的max1,其实是有返回值的。补全的话在第7行后面是有一句return 0的,但是这个返回值不是你实际会用到的,它的意思只是说你的这段程序是正确的。是可执行的。
4、max3没有返回值,它虽然有输出,但是这个输出的i或者j不是这个函数的返回值,只是函数执行的一个步骤而已。max1中的printf输出也是同理
当程序编译后link,讲函数地址保存在段寄存器中,代码段内,当某处调用此函数时(汇编代码CALL),将此地址压入栈中,并且根据指令地址寄存器(程序计数器内)中保存的值计算到该函数地址的偏移量,随后通过__cdecl等调用方式将参数和局部变量压入栈中。具体的过程比较复杂,具体应该参照PE结构等。比较深入,我也只是粗略了解
可以参考计算机组成与设计一书
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)