对不起,如果这似乎是一个基本问题。我一直在学习中期,我已经来了,我似乎无法将其缠住。我知道,当您需要发送参数时,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
的值,即1
,2
和3
。有一个这样的论点,是指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*
数组的开始的指针。