【发布时间】:2016-05-29 16:03:40
【问题描述】:
我正在学习 C 语言,但我还不太熟悉,但我正在学习一些课程,并且我收到了关于重复的“const”声明说明符的编译器警告。
违规行是;
int main(int argc, const char const *argv[])
除非我严重误解了 const 在参数定义中的工作方式,因为 argv 是我需要使用的数组;
int main(int argc, const char const **argv)
或许
int main(int argc, const char *argv[])
编译器不会抱怨这些选项中的任何一个,如果我的想法是正确的,那么两者都应该产生相同的结果,因为 *argv[] 是指向数组的指针。我意识到如果 argv 不是数组,它们会有不同的含义,但是在这种特殊情况下,它们产生相同的结果并且它们是正确的声明而不是原始声明,我错了吗?
【问题讨论】:
-
argv可以修改,不一定是const,也许你在找const char *const pointer,其中第一个const表示指向的数据是const,第二个意味着指针本身是 const 的,即它不能指向其他任何东西,只能指向它的原始值。 -
不,从技术上讲,它们并不相同。第一个sn-p是
char *的数组,第二个是双指针。 -
@RPGillespie 你有很多东西要学。使用第一个 sn-p(不带 const),尝试
for (int i = 0; i < argc; i++) printf( "%s\n", *argv++ );并查看编译器对此有何评论(无),以及它是否有效(有效)。点是,即使参数被指定为一个指针数组,它实际上是一个双指针。 -
@fanton 不,当
char *p[]作为函数参数出现时不会。在其他情况下,当然可以。 -
@RPGillespie C 标准在函数参数列表中定义它们完全相同。在 C 中无法按值传递数组
标签: c arrays pointers char constants