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



对不起,如果这似乎是一个基本问题。我一直在学习中期,我已经来了,我似乎无法将其缠住。我知道,当您需要发送参数时,argv可以在命令行中使用,但是我的教授给我们的答案似乎都没有意义。

函数main(int argc, char *argv[])中的参数argv是:
答:一系列字符
B.一个字符串
C.字符的一系列指针
D.角色指针
E.以上都没有

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

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

您的讲师错误打算选择C或您的讲师为入门班设计一个问题,除非是额外的信用。

我认为您的教授想要 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 语法隐藏了许多罪恶,er,差异。您可以将标记符号与数组和指针一起使用。因此,我们的函数F可以将m 几乎像一个数组一样对待,除了它需要长度,因为它不能从大小中得出长度,因为大小是指针的大小。

让我这样说。当调用F时,"堆栈上的参数"不是a的值,即123。有一个这样的论点,是指a的第一个元素的指针(通常被认为是第一个元素的地址)。您可以将该指针用作数组,部分是因为数组的名称也指的是第一个元素的地址。

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

$ foo sam I am

操作系统做什么?不知何故,它必须将这4个字符串(字符阵列)传递给您的程序。在某个地方,它必须为他们分配连续的空间。概念上,外壳可能会做类似:

的事情
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,我不记得 - 数组中的最后一个元素(!)必须是一个空指针。)

数组还是指针?波还是粒子?您的立场取决于您坐在哪里。argv当然是指针A到char*。但是,根据定义,这是指向char*数组的开始的指针。

最新更新