初始化静态字符常量指针somevar。

10

我正在阅读一段代码,在其中有

#include ...

static char const *program_name;

...
int main(int argc, char** argv){
program_name = argv[0];

...
}

我想知道主函数如何给一个const变量赋值。任何帮助都将不胜感激!

2个回答

15

声明:

static char const *program_name;

program_name 是指向常量字符的 (变量) 指针。指针可以改变(因此可以在 main() 中进行赋值),但通过该指针指向的字符串不能通过该指针更改。

与之相比:

static char * const unalterable_pointer = "Hedwig";

这是一个指向变量数据的常量指针;指针本身不能改变,但如果它最初指向的字符串不是文字常量,则该字符串可以被修改:
static char owls[] = "Pigwidgeon";
static char * const owl_name = owls;

strcpy(owl_name, "Hedwig");

/* owl_name = "Hermes"; */ /* Not allowed */

同时也要与以下内容进行比较和对比:

static char const * const fixed_pointer_to_fixed_data = "Hermes";

这是一个指向常量数据的常量指针。


谢谢您提供的另外两个例子!那么我猜 *program_name 如果按照原始方式声明,即 static char const *program_name;,那么它就是 const 的。这是您的意思吗? - AoZ
正确。你不能写*program_name = 'a';,因为program_name指向常量数据;你不能通过这个指针修改数据(尽管其他指向相同数据的指针可能能够修改它——在这种情况下,如果你想要的话,你可以写*argv[0] = 'a';,尽管我想不出想要这样做的好理由)。 - Jonathan Leffler

8
program_name是一个指向const char的指针,而不是一个const指针。赋值语句将一个值赋给指针本身,而不是指向的内容。

你的回答也有道理,但我更喜欢Jonathan的详细解释。不过还是谢谢! - AoZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接