《目录》
- 最小的 main() 函数
- 形参
- 返回值
- 获取 main() 函数的返回值
- argc AND argv
最小的 main() 函数
int main(){ }
// 默认返回 return 0, int 不能改成 void 、float 。
形参
main 函数的标准写法:
int main(void)
int main(int argc, char **argv)
int main(int argc, char *argv[])
第一个是无形参,第二、三个虽然写法不同但用于函数参数是等价的。
但
。
按照 argv 与符号的优先级决定,前 argv 是指针,指向了char *型指针,后 argv是数组,数组的每一个元素都是char *型指针。
用于函数形参时,由于C的函数是传值调用的。
作为 "类型的数组" 的形参应该调整为 "类型的指针"。
在函数形参定义这个特殊情况下,编译器必须把数组形式改写成指向数组第 0 个元素的指针形式。
编译器只向函数传递数组的地址,而不是整个数组的拷贝。
void func(int *argv){ ...... }
void func(int argv[]){ ...... }
void func(int argv[9]){ ...... }
用于函数定义中这 3 种方式完全等价。
int main(int argc, const char **argv)
int main(int argc, const char *argv[])
Xcode 加了个 const。
返回值
每个函数的设计都有返回值,main() 函数也不例外。
因为函数本质是一段代码,可以看成一个 "黑盒子"。
在外面的函数看不出 "黑盒子" 的状态,因此 "黑盒子" 需要把当前的状态传递给另一个函数,方便判断状态、被调用等。
每个函数都被 main() 函数直接或间接调用,没被 main() 函数直接或间接调用的函数在程序中是无用的。
那 main() 函数会被 谁 调用呢 ?
main() 函数是特殊的,main() 函数是程序的入口,main 是 C语言 的保留字。
运行 main() 函数也就是运行了这个程序,而程序本身是一个进程的创建、加载、运行、消亡。
linux 中执行一个程序其实是创建一个新进程而后把这个程序放入这个进程中。
进程是由父进程 创建 出来的,所以 main() 函数是被创建 ta 的父进程调用。
父进程需要拿到 main() 函数的返回值(0表示正常,负数表示失败),来判断程序是否正常运行或者说领导交给下属的事情,下属必须完成汇报情况。
p.s. C语言真正的启动函数[VC]
获取 main() 函数的返回值
以最小的 main 函数示例。
为了达到好的视觉效果,最好创建一个文件夹在那里面测试。
创建好了的话,把上图的代码写成一个 .c 文件(文件名,随意),如图。
不同系统的编辑命令不一样,本篇文章为 Mac 系统。
Windows 和 Linux 部分命令
[Mac]
- vim smallest_main.c
- 输入 i
- 输入最小 main() 函数代码
- 摁 "esc" ,输入 " :wq " , 摁 "enter / return" 保存。
输入ls命令可以看到刚刚创建的文件,再创建一个获取 main() 函数返回值的文件(文件名,随意)。
- vim return.sh p.s. 不同系统的命令行编辑命令不一样所以百度一下,您就知道。
- 输入 i
- 输入代码,见下图。
- 摁 "esc" ,输入 " :wq " , 摁 "enter / return" 保存。
现在这个文件夹有俩个文件,分别是
编译 smallest_main.c ,输入 gcc smallest_main.c。
使用 shell 命令运行 return.sh 文件即可得到 main() 函数的返回值。
argc AND argv
argc和argv,是父进程给 main() 函数传参。
接受 main() 函数的返回值是因为想知道事情办的怎么样,而传参是想提高函数的灵活性。
函数设计可以没有参数,但这个函数的作用不大,一般是打印什么东西.....
int main(void) 的书写方式很普遍。
如果不传参,修改程序可能需要直接修改源代码。这对于软件用户来说,是无法接受的。
父进程给 main() 函数传参是通过 argc、argv 俩个形参,argc、argv 名字是可以如普通函数形参随意取。
argc、argv 是通用的写法,可读性好。
argc:int 类型,表示运行程序的时候给 main() 函数传递了几个参数。
argv:字符串数组,这个数组用来存储多个字符串,一个字符串就是一个传去的参数,数量取决于 argc。
argv[0] 是第一个传去的参数,argv[1] 是第二个传去的参数......
#include <stdio.h>
int main( int argc, const char *argv[] )
{
printf("父进程有 %d 个交代\n", argc);
for( int i = 0; i < argc; i ++ )
printf("第 %d 个交代是: %s", i, argv);
return 0;
}
运行后发现默认传 1 个参数。
可以先编译这个文件,接着运行程序 ./a.out 后面跟几个参数。
e.g. 输入 ./a.out one two three 4 five,这样就传了 6 个参数,./a.out 也算。
标签:...,argc,函数,int,argv,返回值,main From: https://blog.51cto.com/u_13937572/6417557