很抱歉,这似乎是一个基本问题。我一直在学习中期即将来临,我似乎无法绕过这个。我知道当你需要发送参数时,argv
可以在命令行中使用,但是我教授给我们的答案都没有意义。
函数
argv
中的参数main(int argc, char *argv[])
为:
A.一系列人物
B.一根绳子 C.一系列指向字符的指针 D.字符指针
E.以上都不是
我觉得这不是上述情况,但可能是因为我不完全理解argv
的概念。任何帮助将不胜感激!
答案 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
的值,即1
,2
和3
。只有一个这样的参数,一个指向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*
数组开头的指针。