数组的地址及其所有元素的地址不是常量吗?
如果是这样,在这样的声明中:
char *const argv[]
const
限定符不是多余的吗?
最佳答案
不,char *const argv[]
中的 const
不是多余的。
首先,const
和“constant”在C 中实际上是两个不同的东西,尽管const
关键字显然是从“constant”一词派生而来的。 常量表达式 是可以在编译时求值的表达式。 const
的真正意思是“只读”。例如:
const int r = rand();
完全合法。
是的,数组的地址——就像任何对象的地址一样——是只读的。但这并不意味着数组的值(由其元素的值组成)是只读的,就像其他任何对象都必然是只读的一样。
考虑这三个声明:
char *arr1[10];
char *const arr2[10];
const char *arr3[10];
arr1
是指向 char
的指针的 10 元素数组。您可以修改 char*
元素并且您可以修改这些元素指向的对象。
arr2
是指向 char
的 const
(只读)指针数组。这意味着您不能修改数组的 char*
元素(一旦它们被初始化)——但您仍然可以修改那些 char*
对象或数组元素指向。
而arr3
是指向const char
的指针数组;您可以修改数组元素,但不能修改它们指向的内容。
现在您使用名称 argv
的事实表明您正在谈论 main
的第二个参数,这对此有一些巨大的影响。语言指定 main
的第二个参数是
char *argv[]
或者,等价地,
char **argv
没有const
。您可以可能添加一个,但最好遵循标准指定的形式。 (更新:我从你的评论中看到你问的是 getopt()
的 argv
参数,它被定义为 char * const argv[]
.)
因为它是一个定义为数组的参数,所以另一个规则开始起作用:定义为某种类型数组的参数被“调整”为指向该类型的指针。 (此规则仅 应用于参数。)这不是运行时转换。函数不能有数组类型的参数。
C 中数组和指针之间的关系可能会令人困惑——并且存在很多错误信息。最重要的是要记住,数组不是指针。
comp.lang.c FAQ 的第 6 节是对细节的极好解释。
关于c - 什么是 C 中的常量指针数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22763362/