[英]Why is the argument of main char **argv an array of Strings in c
在c的主要函数中,看到类似这样的现象并不罕见,
int main(int argc, char **argv){}
我对此有一些疑问。 看来这是一个字符串数组,因为我可以访问argv[0]
并获取程序的名称,或者访问argv[1]
并获取传递给程序的参数。 为什么char **argv
是一个字符串数组? 我会以为它是一个指向名为argv的字符的指针的指针。 如果它不是字符串数组,那么为什么我可以这样访问它。
在C语言中,当大多数表达式中都使用数组名称时,表达式中使用的值就是数组第一个元素的地址,然后其类型就是该元素类型的指针。 将数组传递给函数时,情况仍然如此。 因此,即使C的语法允许您声明:
void foo(int x[]);
x
具有的类型不是int
数组,而是指向int
指针。 因此,它实际上与以下内容相同:
void foo(int *x);
对于main
,这意味着:
int main(int argc, char *argv[]);
实际上与:
int main(int argc, char **argv);
允许数组名称“衰减”为指针类型是为C的新类型功能唯一创建的功能,以保持与C的无类型前任的向后兼容性。 从C语言的发展
...例如,早期的Unix系统的目录条目可能用C描述为
struct { int inumber; char name[14]; };
我希望该结构不仅可以表征抽象对象,而且还可以描述可能从目录中读取的位的集合。 编译器可以在哪里隐藏指向语义所要求名称的指针? 即使更抽象地考虑结构,并且可以以某种方式隐藏指针的空间,当分配一个复杂的对象时,我可能会如何处理正确初始化这些指针的技术问题?
该解决方案构成了无类型BCPL和类型C之间的进化链中的关键跳跃。它消除了指针在存储中的实现,当在表达式中提及数组名称时,导致了指针的创建。 在今天的C语言中仍然存在的规则是,当数组类型的值出现在表达式中时,它们将转换为指向组成数组的第一个对象的指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.