argv = NULL的含义是什么?const修饰main参数后赋值为何无编译错误?
关于main函数参数const修饰与
argv = NULL的疑问解答 嘿,我来帮你把这个问题掰扯清楚!咱们从你的代码里的const修饰逻辑说起,再解释为什么argv = NULL不会报错,以及它到底有啥含义:
先拆解你的main参数声明
你写的main函数参数是:
int main(const int argc, const char* const argv[])
这里要注意一个C语言的小细节:函数参数里的数组会自动退化为指针,所以const char* const argv[]实际上等价于const char* const *argv。咱们一层一层拆解这个类型:
- 最外层的
*argv:argv本身是一个普通指针变量(没有被const修饰),它的值是可以被重新赋值的; - 中间的
const char* const:argv指向的是一个const指针,这个指针本身不能被修改指向,同时它指向的是const char类型的只读字符。
为什么那三行赋值会报错?
咱们逐个分析:
argc = 1:你把argc声明为const int,这意味着argc是只读的局部变量,程序不允许修改它的值,所以编译报错;argv[0] = "argv":argv[0]属于const char* const类型——也就是这个指针本身是const的,不能修改它的指向,所以赋值操作会触发编译错误;argv[0][0] = 'a':argv[0]指向的是const char类型的字符,这些命令行参数通常存放在程序的只读内存区域,不允许修改字符内容,因此也会报错。
为什么argv = NULL不报错?
刚才已经说过,argv本身是一个没有被const修饰的普通指针变量。虽然它指向的内容是只读的,但指针自己的值是可以修改的。argv = NULL就是把这个局部指针变量的值改成NULL,让它不再指向原来的命令行参数数组的首地址——这个操作完全符合语法规则,所以编译器不会报错。
argv = NULL的作用和含义
从语法上来说这个操作是合法的,但实际上没有任何实际作用:
argv是main函数的局部参数变量,修改它只会在main函数内部生效,不会影响程序外部的任何状态;- 当main函数执行完
return语句后,这个变量就会被销毁,所以这个修改不会留下任何痕迹。
简单来说,就是你在函数内部把一个局部指针的指向改了,但对程序的运行结果没有任何影响。
内容的提问来源于stack exchange,提问作者Jin Kwon
相关产品推荐
相关产品推荐

