C++零基础到工程实战(3.4):入口函数 main 参数传递和环境变量获取

张开发
2026/4/12 7:58:45 15 分钟阅读

分享文章

C++零基础到工程实战(3.4):入口函数 main 参数传递和环境变量获取
目录一、本节学习内容概要图二、前言三、main 函数的常见写法3.1 最基础写法无参数形式3.2 带参数的 main3.3 带环境变量的写法1argc 和 argv 是最常见、最标准的形式2env 这种第三参数写法是常见扩展不是最核心的标准入口形式四、argc 是什么4.1 argc 的含义4.2 为什么“不传参数”时 argc 也往往等于 14.3 一个简单理解方式五、argv 是什么5.1 argv 的本质5.2 argv[0] 表示什么1可能只是程序名2可能是相对路径3可能是完整路径5.3 argv[1]、argv[2]……表示什么六、结合示例代码理解 argc 与 argv6.1 示例代码:6.2 第一部分输出参数个数6.3 第二部分输出 argv[0]6.4 第三部分访问用户传入的参数6.5 第四部分输出环境变量中的第一个字符串七、什么是环境变量 env7.1 环境变量的本质7.2 env 的形式7.3 env 数组为什么能遍历八、Visual Studio 中如何给 main 传参数8.1 设置路径8.2 运行后程序会收到什么8.3 为什么截图里 argc 4九、总结一、本节学习内容概要图二、前言前面我们学习 C 基本语法时经常会直接写int main() { return 0; }这说明main是程序的入口函数程序启动后就从这里开始执行。但实际上main不只是“程序入口”这么简单它还可以接收命令行参数甚至在某些编译器或平台下还能拿到环境变量。这意味着程序启动时可以把外部数据传给程序程序可以根据不同参数执行不同逻辑程序还能读取操作系统提供的运行环境信息。这在工程开发中非常常见例如启动程序时指定调试模式传入配置文件路径传入输入文件名与输出文件名读取系统环境变量中的路径、账号、语言等信息。所以理解main的参数传递机制是从“会写 C 程序”走向“会写工程程序”的重要一步。三、main 函数的常见写法3.1 最基础写法无参数形式最常见的是下面这种int main() { return 0; }这种写法表示程序从main开始执行不接收命令行参数返回值是int类型一般返回0表示程序正常结束。对于初学阶段这种写法已经足够了。3.2 带参数的 main当程序需要从外部接收数据时常见写法是int main(int argc, char* argv[]) { return 0; }或者写成int main(int argc, char* argv[]) { // ... }这里有两个非常重要的参数argcargv它们分别表示参数个数和参数内容。3.3 带环境变量的写法int main(int argc, char *argv[], char *env[]) { return 0; }这说明除了命令行参数外还额外接收了环境变量数组。不过这里要特别说明一点1argc和argv是最常见、最标准的形式标准 C/C 中最常用、最通用的是int main() int main(int argc, char* argv[])2env这种第三参数写法是常见扩展不是最核心的标准入口形式很多编译器、很多平台支持int main(int argc, char* argv[], char* env[])它确实能用尤其在一些教学示例或特定编译器环境里很常见但它更像是一种实现扩展。四、argc 是什么4.1 argc 的含义argc的全称一般理解为argument count也就是命令行参数的个数它表示程序运行时一共接收了多少个参数。4.2 为什么“不传参数”时 argc 也往往等于 1这是初学者最容易疑惑的地方。很多人以为“不传参数”就应该是0但实际上通常不是。原因是程序自身的名字或者程序路径也会被算作第一个参数。也就是说argv[0]通常不是用户额外输入的参数argv[0]一般表示程序本身的名称或者程序可执行文件路径所以即使你什么都不额外传参数数组里通常也已经有一个元素了。因此不传额外参数时通常argc 1传 1 个额外参数时通常argc 2传 2 个额外参数时通常argc 34.3 一个简单理解方式假设你运行程序的形式是test_main.exe DEBUG 16 3.14那么系统通常会把它拆成下面几个字符串argv[0] test_main.exe argv[1] DEBUG argv[2] 16 argv[3] 3.14此时总共 4 个字符串所以argc 4五、argv 是什么5.1 argv 的本质argv可以理解为argument vector也就是参数字符串数组它本质上是一个“字符串数组”数组中的每个元素都是一个 C 风格字符串。例如char* argv[]表示argv是一个数组数组中的每个元素是char*每个char*指向一个字符串首地址每个字符串最后都以\0结束。所以可以把argv理解为“程序启动时系统帮你整理好的一组字符串参数”。5.2 argv[0] 表示什么通常情况下表示程序本身的名字或者可执行文件路径。这里注意我用的是“通常”。因为不同操作系统、不同 IDE、不同启动方式下argv[0]的内容可能略有差异1可能只是程序名例如test_main.exe2可能是相对路径例如.\test_main.exe3可能是完整路径例如C:\Users\xxx\Debug\test_main.exe所以写文章时建议表述成argv[0]一般表示当前执行程序的名称或路径。这样更准确。5.3 argv[1]、argv[2]……表示什么从argv[1]开始才是用户额外传入的参数。例如test_main.exe DEBUG 16 3.14那么argv[1] DEBUGargv[2] 16argv[3] 3.14注意它们本质上都是字符串。也就是说即使你输入的是16 3.14程序拿到的也仍然是字符串16和3.14而不是整数和浮点数。如果想把它们变成数值类型还需要自己转换。六、结合示例代码理解 argc 与 argv6.1 示例代码:#include iostream using namespace std; int main(int argc,char *argv[],char *env[]) { //访问argv字符串数组中的内容 //从0开始是第一个字符串 //第一个参数是执行程序完整路径 cout argc argc endl; cout argv[0] argv[0] endl; //第二个参数是用户传递 —— 执行程序的全局路径 // ./test_main debug info // test_main debug info // test_main.exe debug info if (argc 1) cout argv[1] endl; if (argc 2) cout argv[2] endl; if (argc 3) cout argv[3] endl; cout env[0] endl; }6.2 第一部分输出参数个数cout argc argc endl;这句代码用于输出参数总数。如果运行方式是test_main.exe DEBUG 16 3.14那么输出一般会是argc 4因为一共有四个字符串程序自己DEBUG163.146.3 第二部分输出 argv[0]cout argv[0] argv[0] endl;这句代码输出程序本身的名字或路径。比如可能显示 test_main.exe也可能显示为完整路径这取决于运行环境。6.4 第三部分访问用户传入的参数if (argc 1) cout argv[1] endl; if (argc 2) cout argv[2] endl; if (argc 3) cout argv[3] endl;这里为什么先判断argc再访问argv[i]因为如果参数数量不够你直接访问不存在的位置就会出问题。例如只传了一个参数这时argv[2]可能就不存在如果硬访问程序行为就不可靠了。所以访问argv[i]之前先判断argc i这是很重要的习惯。6.5 第四部分输出环境变量中的第一个字符串cout env[0] endl;这句代码表示输出环境变量数组中的第一个元素。环境变量通常是这样的字符串PATHxxxx TEMPxxxx USERNAMExxxx因此env[0]输出的通常就是某个环境变量字符串而不是普通命令行参数。七、什么是环境变量 env7.1 环境变量的本质环境变量是操作系统提供给程序的一组“键值对信息”。例如系统可能给程序提供PATHC:\Windows\System32 USERNAMEAdministrator TEMPC:\Users\xxx\AppData\Local\Temp这些信息能帮助程序知道当前运行环境。7.2 env 的形式在你这个写法里char* env[]它本质上也是一个字符串数组。也就是说env[0]是一个字符串env[1]是一个字符串env[2]还是一个字符串最后会用一个空指针作为结束标记。所以它和argv很像只不过argv装的是命令行参数env装的是环境变量字符串。7.3 env 数组为什么能遍历因为环境变量数组通常最后会有一个nullptr作为结束标志所以常见写法是for (int i 0; env[i] ! nullptr; i) { cout env[i] endl; }这表示从env[0]开始输出一直输出到遇到空指针为止。八、Visual Studio 中如何给 main 传参数8.1 设置路径一般步骤是右击项目选择“属性”找到“调试”在“命令参数”里输入参数内容8.2 运行后程序会收到什么如果你设置的是DEBUG 16 3.14那么程序启动后通常会收到argc 4 argv[0] 程序名或程序路径 argv[1] DEBUG argv[2] 16 argv[3] 3.148.3 为什么截图里 argc 4因为参数总数不是只算你填进去的三个参数还要加上程序本身。也就是程序自己DEBUG163.14九、总结1. main 不只是入口还能接收外部输入程序启动时操作系统可以把命令行参数传给main。2. argc 表示参数总个数它统计的是“全部参数数量”通常包括程序自己。3. argv 是字符串数组argv[0]一般是程序名或路径argv[1]开始才通常是用户额外输入的参数。4. 不传额外参数时argc 通常为 1因为程序本身通常也算第一个参数。5. 命令行参数本质上都是字符串即使输入的是16或3.14程序拿到的也还是字符串需要时要自己转换。6. env 用于获取环境变量它本质上也是字符串数组里面保存的是操作系统提供给程序的运行环境信息。7. 工程开发中非常常用命令行参数和环境变量广泛应用于调试、配置、自动化脚本、工具程序和服务器程序中。

更多文章