抱歉,这似乎是个基本问题。我一直在为期中考试做准备,我似乎对此束手无策。我知道当您需要发送参数时,可以在命令行中使用argv,但是我的教授给我们的答案似乎都没有意义。
函数
argv中的参数main(int argc, char *argv[])是: A.一系列字符 B.字符串 C.指向字符的一系列指针 D.字符指针 E.上述任何一项
我觉得这不是上面提到的,但可能是因为我不完全理解argv的概念。任何帮助都将不胜感激!
发布于 2017-11-22 20:10:04
正确的答案是E,上面没有。尽管参数声明看起来像指向char的指针数组,但C的规则将其调整为指向指向char的指针,C++的规则也是如此。
不管是你的老师错误地选择了C,还是你的老师设计了一个不恰当的问题,除非它是额外的学分,否则在入门课上是不恰当的。
发布于 2017-11-22 23:50:57
我想你的教授想要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时,“堆栈上的参数”不是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]将毫无意义。
(当只有4个参数时,你会问为什么有5个元素?有一条规则-- C或Posix,我不记得了--数组中的最后一个元素(!)必须是空指针。)
数组还是指针?波还是粒子?你站在哪里取决于你坐在哪里。当然,argv是指向char*的指针a。但是,从定义上来说,它是指向char*数组开始的指针。
https://stackoverflow.com/questions/47441911
复制相似问题