首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数main中的参数argv (int,char *argv[])

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

Stack Overflow用户
提问于 2017-11-22 18:49:36
回答 2查看 1.6K关注 0票数 2

抱歉,这似乎是个基本问题。我一直在为期中考试做准备,我似乎对此束手无策。我知道当您需要发送参数时,可以在命令行中使用argv,但是我的教授给我们的答案似乎都没有意义。

函数argv中的参数main(int argc, char *argv[])是: A.一系列字符 B.字符串 C.指向字符的一系列指针 D.字符指针 E.上述任何一项

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-22 20:10:04

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

不管是你的老师错误地选择了C,还是你的老师设计了一个不恰当的问题,除非它是额外的学分,否则在入门课上是不恰当的。

票数 5
EN

Stack Overflow用户

发布于 2017-11-22 23:50:57

我想你的教授想要C,尽管最站得住脚的答案是Eargv引用的数据是一个数组,但变量本身是一个指针。我认为这是值得探讨的原因,因为它与数组或main的类型无关。

考虑一个整数数组,

代码语言:javascript
复制
int a[] = { 1, 2, 3 };

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

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

代码语言:javascript
复制
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的值,即123。只有一个这样的参数,指向a的第一个元素的指针(通常被认为是第一个元素的地址)。可以将该指针用作数组,部分原因是数组的名称也引用了第一个元素的地址。

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

代码语言:javascript
复制
$ foo sam I am

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

代码语言:javascript
复制
char **args = calloc(5, sizeof(char*));
args[0] = "foo"; 
args[1] = "sam"; 
args[2] = "I"; 
args[3] = "am"; 

或,

代码语言:javascript
复制
char args[5] = { "foo", "sam", "I", "am" };

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

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

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

数组还是指针?波还是粒子?你站在哪里取决于你坐在哪里。当然,argv是指向char*的指针a。但是,从定义上来说,它是指向char*数组开始的指针。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47441911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档