c - 什么是 C 中的常量指针数组?

标签 c arrays function pointers constants

数组的地址及其所有元素的地址不是常量吗?

如果是这样,在这样的声明中:

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 是指向 charconst(只读)指针数组。这意味着您不能修改数组的 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/

相关文章:

c - 在范围和特定步骤内在C中生成随机数

c - 是否可以在 C 中使用指针数学访问结构中的数据?

linux - #define SYSCALL_DEFINEx(x, sname, ...)

javascript - 限制用户选中的复选框数量

javascript - 使用 javascript 停止表单?怎么了?

c - 将结构数组传递给函数会更改数组的大小

c - 为什么在 C 中写入二进制文件时 fwrite 会打印空字节?

c++ - 返回 std::array 未知大小

javascript - 如何从数组形成嵌套的 JSON 对象?

onclick 的 Javascript 函数