繁体   English   中英

为什么main char ** argv的参数是c中的字符串数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM