这是一个 C 语言初学者到进阶者都必须掌握的核心知识点。main 函数的参数允许你的程序与操作系统进行交互,接收来自命令行的输入。

(图片来源网络,侵删)
main 函数的三种形式
在 C 语言标准中,main 函数有三种合法的形式,其中前两种最常见。
无参数(最常见)
这是最简单的形式,main 函数不接受任何参数。
#include <stdio.h>
int main(void) {
printf("Hello, World!\n");
return 0;
}
int main(void):int表示函数返回一个整型值给操作系统,0表示程序成功执行,非零值表示执行过程中出现错误。void明确表示该函数不接受任何参数。return 0;:将0返回给操作系统,表示程序正常退出。
带两个标准参数(核心内容)
这是带参数的形式,也是我们讨论的重点。main 函数可以接收两个参数:
int main(int argc, char *argv[]) {
// 函数体
return 0;
}
或者,等价的写法(使用指针的指针):

(图片来源网络,侵删)
int main(int argc, char **argv) {
// 函数体
return 0;
}
我们来分解这两个参数:
参数 argc (Argument Count)
- 类型:
int(整数) - 含义:参数的个数。
- 值:它是一个整数,表示当你的程序启动时,在命令行中输入的总参数数量。
- 关键点:
argc的值至少为 1,这个“1”指的是程序本身的名称,你运行./my_program arg1 arg2,argc的值就是 3。
参数 argv (Argument Vector)
- 类型:
char *argv[]或char **argv(字符指针的数组 / 指向字符指针的指针) - 含义:参数向量,它是一个字符串数组,包含了所有的命令行参数。
- 值:
argv[0]始终指向程序名称的字符串。argv[1]指向第一个参数的字符串。argv[2]指向第二个参数的字符串。argv[argc-1]指向最后一个参数的字符串。argv[argc]是一个NULL指针,标志着数组的结束。
带三个参数(不常用)
这是 main 函数的第三种形式,在 POSIX(如 Linux/Unix)系统中可用,用于访问环境变量。
int main(int argc, char *argv[], char *envp[]) {
// 函数体
return 0;
}
envp:是一个字符串数组,包含了当前进程的环境变量列表。PATH=...,HOME=...等,这个形式不是 C 标准的一部分,但在很多系统中都支持。
完整示例:命令行参数解析
让我们通过一个具体的例子来理解 argc 和 argv。
假设我们编写一个名为 greet.c 的程序,它的功能是向指定的用户问好。

(图片来源网络,侵删)
代码 (greet.c):
#include <stdio.h>
int main(int argc, char *argv[]) {
// 1. 打印参数的总数
printf("Number of arguments (argc): %d\n", argc);
// 2. 检查参数数量是否足够
// 程序名本身算一个,所以至少需要 2 个参数才能执行问候功能
if (argc < 2) {
printf("Usage: %s <your_name>\n", argv[0]);
return 1; // 返回非零值表示错误
}
// 3. 打印所有参数
printf("\nAll arguments:\n");
for (int i = 0; i < argc; i++) {
printf("argv[%d] = \"%s\"\n", i, argv[i]);
}
// 4. 使用第一个参数(用户名)进行问候
printf("\nHello, %s! Welcome to C programming.\n", argv[1]);
return 0;
}
如何编译和运行?
-
编译: 打开终端,使用 GCC 编译器进行编译:
gcc greet.c -o greet
这会生成一个可执行文件
greet(在 Windows 上可能是greet.exe)。 -
运行:
-
不带参数运行
./greet
输出:
Number of arguments (argc): 1 Usage: ./greet <your_name>分析:
argc是 1,因为只提供了程序名./greet。argv[0]是"./greet"。- 因为
argc < 2,程序打印了用法提示并返回错误码1。
-
带一个参数运行
./greet Alice
输出:
Number of arguments (argc): 2 All arguments: argv[0] = "./greet" argv[1] = "Alice" Hello, Alice! Welcome to C programming.分析:
argc是 2,因为提供了程序名./greet和参数Alice。argv[0]是"./greet"。argv[1]是"Alice"。- 程序成功使用
argv[1]来问候用户。
-
带多个参数运行
./greet Bob from NewYork
输出:
Number of arguments (argc): 4 All arguments: argv[0] = "./greet" argv[1] = "Bob" argv[2] = "from" argv[3] = "NewYork" Hello, Bob! Welcome to C programming.分析:
argc是 4。argv[1]是"Bob",argv[2]是"from",argv[3]是"NewYork"。- 程序依然只使用
argv[1],如果你想使用所有参数,需要循环遍历argv数组(从1到argc-1)。
-
参数类型和注意事项
-
参数总是字符串:
argv数组中的所有元素都是char *,即字符串,即使你在命令行中输入数字,argv也会将其作为字符串接收,如果你需要将参数用作数字(./program 123),你必须手动进行类型转换,通常使用atoi(),strtol()或sscanf()等函数。示例:将参数转换为整数
#include <stdio.h> #include <stdlib.h> // 用于 atoi() int main(int argc, char *argv[]) { if (argc != 2) { printf("Usage: %s <an_integer>\n", argv[0]); return 1; } int number = atoi(argv[1]); // 将字符串 "123" 转换为整数 123 printf("You entered the number: %d\n", number); printf("Its square is: %d\n", number * number); return 0; } -
可执行文件路径:
argv[0]有时可能不是简单的程序名,而是完整的路径,/usr/bin/ls或C:\projects\my_program.exe,不要假设argv[0]一定是一个简单的文件名。
| 特性 | 描述 |
|---|---|
| 目的 | 让程序能够接收来自命令行的输入,实现更灵活、更强大的功能。 |
argc |
int 类型,表示参数的总数(包括程序名本身),至少为 1。 |
argv |
char *[] 类型,一个字符串数组,存储了所有的命令行参数。argv[0] 是程序名,argv[1] 到 argv[argc-1] 是用户输入的参数。 |
| 参数类型 | 所有参数在 argv 中都是字符串类型,需要进行手动类型转换才能用于数学运算。 |
| 应用场景 | 几乎所有命令行工具都使用这个机制,如 gcc (编译器), ls (列出文件), cp (复制文件), git (版本控制) 等。 |
掌握 main 函数的参数是成为合格 C 程序员的重要一步,它让你编写的程序能够更好地融入操作系统和用户的工作流中。
