函数main中的参数argv(int argc,char * argv [])

时间:2017-11-22 18:49:36

标签: c++ c argv

很抱歉,这似乎是一个基本问题。我一直在学习中期即将来临,我似乎无法绕过这个。我知道当你需要发送参数时,argv可以在命令行中使用,但是我教授给我们的答案都没有意义。

  

函数argv中的参数main(int argc, char *argv[])为:
  A.一系列人物
  B.一根绳子   C.一系列指向字符的指针   D.字符指针
  E.以上都不是

我觉得这不是上述情况,但可能是因为我不完全理解argv的概念。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:5)

正确答案是E,以上都不是。虽然参数声明看起来像是指向char的指针数组,但C的规则将其调整为指向char的指针,C ++的规则也是如此。

你的导师错误地选择了C或你的导师为介绍课设计了一个不恰当的问题,除非它是额外的功劳。

答案 1 :(得分:2)

我认为你的教授想要 C ,即使迂回正确的答案是 E argv 引用的数据是数组,但变量本身是指针。我认为值得探究的原因,因为它与数组类型或main无关。

考虑一个整数数组,

int a[] = { 1, 2, 3 };

这会分配3个相邻的整数。数组的大小为sizeof(int) * 3

现在让我们编写一个函数来加倍每个成员的值,

void F( int m[], size_t n ) {
    for( int i=0; i < n; i++ ) {
        m[i] *= 2;
    }

int main( int argc, char *argv[] ) {
    F(a, sizeof(a)/sizeof(a[0]));
    return EXIT_SUCCESS;
}

什么是m?它被声明为一个数组,但它确实是一个指针:sizeof(m) == sizeof(int*)。那是因为C 没有将数组作为函数参数传递。 C中的术语是数组参数衰减到指针。

它有点无关紧要,因为C 语法隐藏了许多罪恶,呃,差异。您可以对数组和指针使用下标表示法。出于这个原因,我们的函数F可以将m 几乎视为一个数组,除了它需要长度,因为它无法从大小中获得长度,因为大小是指针的大小。

让我以不同的方式说。调用F时,堆栈上的&#34;参数&#34;不是a的值,即123。只有一个这样的参数,一个指向a的第一个元素的指针(通常被认为是第一个元素的地址)。您可以将该指针部分用作数组,因为数组的名称​​也指的是第一个元素的地址。

现在让我们回到你的朋友argv。数组还是指针?我们假设您的程序 foo 在命令行上调用:

$ foo sam I am

操作系统有什么作用?不知何故,它必须将这4个字符串(字符数组)传递给您的程序。在某个地方,它必须为它们分配连续的空间。 概念,shell可能会执行以下操作:

char **args = calloc(5, sizeof(char*));
args[0] = "foo"; 
args[1] = "sam"; 
args[2] = "I"; 
args[3] = "am"; 

,或者

char args[5] = { "foo", "sam", "I", "am" };

无论哪种方式,它都可以将args传递给 execv (3),调用你的main,然后传递一个...指针。毕竟,它不能通过你的数组,对吧?

请注意args 必须是一个数组。如果它不是argv[1]毫无意义的话。

(为什么5个元素,你问,当只有4个参数?有一个规则 - C或Posix,我不记得 - 数组中的最后一个元素(!)必须是一个NULL指针。)

数组还是指针?波浪还是粒子?你站在哪里取决于你坐在哪里。当然,argv是指向char*的指针。但是,根据定义,它是指向char*数组开头的指针。