扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
main函数可以不带参数,也可以带参数,这个参数可以认为是 main函数的形式参数。
为桐梓等地区用户提供了全套网页设计制作服务,及桐梓网站建设行业解决方案。主营业务为网站建设、成都网站制作、桐梓网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
C语言规定main函数的参数只能有两个,还规定argc(第一个形参)必须是整型变量,argv( 第二个形参)必须是指向字符串的指针数组。加上形参说明后,main函数的函数头应写为:
int main (int argc,char *argv[])
由于main函数不能被其它函数调用,因此不可能在程序内部取得实际值。那么,在何处把实参值赋予main函数的形参呢? 实际上,main函数的参数值是从操作系统命令行上获得的。当我们要运行一个可执行文件时,在DOS提示符下键入文件名,再输入实际参数即可把这些实参传送到main的形参中去。
DOS提示符下命令行的一般形式为:
C:\可执行文件名 参数 参数……
C语言中的输出参数应该是指针吧
int max(int a, int b,int *m)//a,b是输入参数,m是输出参数
{
*m = ab?a:b;
return *m;
}
int main()
{
int a=2,b=3,m;
max(a,b,m);
printf("max=%d\n",m);
}
如果使用的是Dev-c++,那么将光标移至函数的括号内,弹出的黄色方框就有参数提示
汇编代码gcc:
第一个问题的汇编:
movl $0, %ebx
incl %ebx
incl %ebx
incl %ebx
movl %ebx, 8(%esp)
movl %ebx, 4(%esp)
movl %ebx, (%esp)
call _func
汇编显示,先将n自增了3次变为3,然后调用函数,因此都是3
第二个问题的汇编:
movl $3, 16(%esp)
movl $98, 12(%esp)
movl $2, 8(%esp)
movl $97, 4(%esp)
movl $1, (%esp)
call _func2
可以看出参数对应的栈地址应该是连续的
另外,这个程序在VC6下的结果完全不一样:
func for n++
0 0 0
12ff2c 12ff30 12ff34
func for ++n
3 2 1
12ff2c 12ff30 12ff34
func2
12ff24 12ff28 12ff2c 12ff30 12ff34
但是最后的地址也是连续的。
此类问题知道上问过多次了,可以说没有什么意义,结果与编译器实现相关,实际编程没有用处,除非写代码的人喜欢玩花俏
1、通过函数的参数显示传递:
A(int a)
{
a = a+2;
}
B(void)
{
int b = 3;
A(b);
}
在函数A中a作为一个参数传入函数中进行运算,那么a就可以算作是A的输入,然后在程序内部a进行了运算后值变了,那么运算后的a又算作是A函数的输出。
2、通过全局变量隐式传递:
全局变量你应该知道吧,简单点说就是作用域涵盖整个程序的变量(当然要看具体情况)。
假设a为int型全局变量,初始值为1:int a = 1;
A()
{
a = a + 2;
}
B()
{
a = a + 3;
}
main()
{
A();
B();
A();
}
通过main函数我们可以看到,程序首先执行的是函数A,那么执行完函数A后全局变量a的值由初始值1变成了3,然后又继续执行函数B,注意此时函数B也是对a进行运算,那么此时全局变量a成了B的输入,运算后a的值为了6,此时a为B的输出。那么也就是说全局变量a在经过A函数的改变后作为一个输入隐式的传入了B函数,然后经过B函数的运算又算作是B的输出。执行过B函数后程序又遇到了A函数,那么此时经过B函数运算的a又作为A函数的一个输入了。
因为自定义函数在main函数的后面,所以第一行先声明使用了一个名为hello的函数,函数在主函数的后面。
再看主函数,赋值应该会吧,把j=5的值通过hello函数赋给变量i,进行运算i=9。再返回主函数,将9赋给K,然后输出k,值为9.
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流