【发布时间】:2014-10-14 05:21:51
【问题描述】:
(我是C初学者,可能我的问题不是很聪明,但我在问之前已经google了。)
我在git源码中看到了如下代码:
int main(int argc, char **av) {
const char **argv = (const char **) av;
// ... more code ...
}
它将char **av转换为const char **argv,我以为是为了让参数不可变,但我写了一个程序,发现两者都argv 和 argv[i] 是可变的。
问题 1:这行代码的目的和优点是什么?
问题 2:const 指针的行为是什么?我用谷歌搜索,但没有找到好的答案。
@更新
我根据答案测试了更多,貌似argv[i][j]是不可变的,但是argv和argv[i] 是可变的。
所以指针上的 const 使得原始值不可变,但指针本身仍然是可变的。
因此我猜来自 git 的代码的主要目的也是为了防止更改原始参数。
测试代码:
#include <stdio.h>
int main(int argc, char * av[]) {
// modify value pointed by a non-const pointer - ok
av[0][0] = 'h';
printf("argv[0] = %s\n", av[0]);
// modify const pointer itself - ok
const char **argv = (const char **) av;
argv[0] = "fake";
printf("argv[0] = %s\n", argv[0]);
char *arr[] = {"how", "are", "you"};
argv = (const char **)arr;
printf("argv[0] = %s\n", argv[0]);
// modify the value itself which is pointed by a const pointer - bad, an error will be thrown,
/*
argv[0][0] = 'x';
printf("argv[0] = %s\n", argv[0]);
*/
return 0;
}
当前代码可以编译和运行,没有警告或错误,但如果取消注释最后的 2 行注释,那么编译时会抛出以下错误:
错误:分配只读位置“**argv”
【问题讨论】: