C语言中定义argv数组变量时为何需要使用星号*?
认知前提纠正
你首先搞错了C语言数组的本质:数组根本不是“存储首元素地址的指针”,这是C入门阶段最普遍的经典误解。
数组的本质是一段连续的内存块,内存块里直接存所有元素的实际值,没有多余的空间单独保存首元素地址;只有当数组作为参数传入函数、或者参与部分表达式运算时,才会隐式退化为指向首元素的指针值——这个值是编译器临时计算得到的,不是数组本身存储的内容。
char *argv[3]的声明逻辑 C语言声明的解析遵循运算符优先级规则:数组下标运算符[]的优先级比解引用运算符*高,所以这个声明从变量名向外拆解的结果非常明确:
argv是一个长度为3的数组- 数组内每个元素的类型是
char*,也就是指向字符类型的指针
如果你要定义的是“指向char数组的指针”,才需要用括号改变优先级,写成char (*argv)[3],但这和示例的使用场景完全不匹配。
结合示例代码的验证
你给出的示例代码逻辑,刚好和char *argv[3]的类型完全匹配:
char *argv[3]; argv[0] = "echo"; argv[1] = "hello"; argv[2] = 0; exec("/bin/echo", argv); printf("exec error\n");
- 代码里给
argv[0]、argv[1]赋值的字符串字面量,在C中求值结果就是指向字符串首字符的char*类型指针,刚好能存入数组的对应位置 argv[2] = 0是存入空指针标记参数列表结束,符合exec类系统调用的参数规范- 调用
exec传入argv时,数组发生隐式退化,实际传入的是指向数组首元素的char**类型指针,完全匹配函数的参数要求。
如果按你误解的“数组本身就是指针”,把声明写成char argv[3],那这个数组总共只有3字节空间,只能存3个单字节字符,连一个指针的长度都不够(64位系统下指针占8字节),根本不可能实现存储多个字符串参数的功能。
内容的提问来源于stack exchange,提问作者Aries Zhao
相关产品推荐
相关产品推荐

