为什么C中的argv(参数向量)被定义为指针?为什么需要将其第0个定义为程序名?

2024-04-10

#include <stdio.h>
int main(int argc, char *argv[])
{
 int i;
 for(i=1;i<argc;i++)
  printf("%s%s", argv[i], (i<argc-1)? " ":"");
 printf("\n");
 return 0;
} 

上面给出的是一个输出命令行输入的简单 C 程序。这里argc是参数计数器。argv据说是一个包含参数的数组。我的问题是:为什么它定义为指向字符数组的指针而不是普通数组?另外,需要将其第零个元素(argv[0])定义为调用程序的名称。

我是初学者,请解释一下高层次的观点。


argv被定义为指针而不是数组,因为 C 中没有数组参数这样的东西。

你可以定义一些东西looks类似于数组参数,但它在编译时“调整”为数组类型;例如,这两个声明完全相同:

int foo(int param[]);
int foo(int param[42]); /* the 42 is quietly ignored */
int foo(int *param);    /* this is what the above two declarations really mean */

和定义main可以写成:

int main(int argc, char *argv[]) { /* ... */ }

or as

int main(int argc, char **argv) { /* ... */ }

两者完全相同(恕我直言,第二个更清楚地表达了实际情况)。

从某种意义上说,数组类型是 C 中的第二类类型。操作数组的代码几乎总是通过指向元素的指针来实现,执行指针算术来遍历元素。

第 6 条comp.lang.c 常见问题解答 http://www.c-faq.com/解释了数组和指针之间经常令人困惑的关系。

(如果您被告知数组是“真正的”指针,那么它们不是;数组和指针是不同的东西。)

至于为什么argv[0]指向程序名称,那只是因为它有用。有些程序在错误消息中打印出它们的名字;其他人可能会根据调用它们的名称来改变它们的行为。将程序名称与命令行参数捆绑在一起是一个相当随意的选择,但它很方便并且有效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么C中的argv(参数向量)被定义为指针?为什么需要将其第0个定义为程序名? 的相关文章

随机推荐