int main(int argc, char* argv[]) 和 int main(int argc, char** argv) [关闭]

Posted

技术标签:

【中文标题】int main(int argc, char* argv[]) 和 int main(int argc, char** argv) [关闭]【英文标题】:Is there any difference between int main(int argc, char* argv[]) and int main(int argc, char** argv) [closed] 【发布时间】:2020-11-03 21:54:14 【问题描述】:

int main(int argc, char* argv[])int main(int argc, char** argv) 有什么区别吗 我看不出有什么不同。 还有,哪个更好用?

【问题讨论】:

char* argv[]char **argv 是等价的。但是,您的问题中的char** argv[] 不是。前两个之间的选择是任意的。我喜欢括号,因为它感觉更像数组。 由于启动代码不知道您使用的是哪一个,因此两个变体的结果必须相同。因此,您可以选择您最喜欢的一个。 技术上没有。第一个 (char *argv[]) 是旧约定,可能被认为在语义上更准确,因为argv 是一个指针数组。 错字已修复,我一直使用int main(int argc, char* argv[]),这就是我打错字的原因。 @Some 程序员老兄,Re "argv 是一个指针数组。",不,不是。它是一个指针。例如,sizeof(argv) 将返回指针的大小。 【参考方案1】:

两者没有语义上的区别

int main(int argc, char* argv[])

int main(int argc, char** argv)

。它们具有相同的含义。我个人更喜欢前者,因为我认为它更清楚地传达了第二个论点的重要性。

【讨论】:

【参考方案2】:

没有区别。我更喜欢带有数组声明的那个,因为它更清楚地表明它是一个字符串数组。

【讨论】:

不,argv 不是字符串数组。它是一个指针。例如,sizeof(argv) 将返回指针的大小。 它不是 C 意义上的字符串数组。它根本不是 C 数组。它是一个 C 指针。 @Gerhard,Proof。您也可以通过添加++argv; 来证明这一点。添加++array; 会导致程序编译失败。但是如果添加++pointer;++argv;,程序仍然可以编译成功。 @Gerhard,指针和数组是不同的东西。 1) 数组在用作指针时退化为指向其第一个元素的指针。所以a == &( a[0] ) 将永远为真(如果a 是一个数组)。此外,数组的地址是其第一个元素的地址,因此&a == &( a[0] ) 始终为真。这也意味着a == &a 始终为真。 2)您不能分配给数组(这就是为什么++array; 在前面的示例中无法编译的原因),但您显然可以分配给指针。 (显然,您可以分配给数组的元素。) 最后,3)函数参数不能是数组。 void foo(char x[5]); void bar(char x[]); 表示 void foo(char *x); void bar(char *x);。用作参数的参数的数组将降级为如上所述的指针。这就是为什么argv 不可能是一个数组。【参考方案3】:

两者语法相同。你可以选择任何语法。

int main(int argc, char* argv[]) 

int main(int argc, char** argv)

第一个对于初学者来说更清晰易懂。

【讨论】:

int b;char x;也使用相同的语法。它们使用相同的语法这一事实并不意味着它们可以像您声称的那样互换。 (它们确实可以互换,只是不是因为您声称的原因。) @ikegami 我没有说你可以用char替换int。 int 类型变量占用 4 个字节,char 占用 2 个字节。 不,但你确实说过两件事是等价的,因为它们使用相同的语法,这显然是一个无效的论点。您应该将“两种语法都相同。您可以选择任何一种语法。”替换为“以下两者都是等效的。您可以使用任何一种。”跨度> 我说的是它的内存表示和访问。 这可能是你的意思,但那不是你说的。如果我可能直言不讳,你说的没有道理,真的。 (对于初学者,您在第一句话中说它们是相同的语法,而您在第二句话中说它们是不同的语法。)我在之前的评论中提出了重新措辞。

以上是关于int main(int argc, char* argv[]) 和 int main(int argc, char** argv) [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

main (int argc,char *argv[]) 或main (int argc,char **argv)区别

int main(int argc,char* argv[])详解

int main(int argc,char*argv[])

int main(int argc,char* argv[]) 解析

int main(int argc,char* argv[])详解

int main(int argc,char* argv[])浅析