静态常量字符指针以及它以这种方式使用的原因

时间:2015-03-11 08:34:56

标签: c++ c static char const

static const char* const test_script = "test_script";

您何时以及为何使用上述声明? 它有什么好处吗?

为什么使用char*而不是常量字符? A"常量字符指针" (const char*)已经是一个常数,不能改变;那么为什么要在它前面使用static这个词呢?这有什么用呢?

1 个答案:

答案 0 :(得分:7)

const char *p 不是常量指针。它是指向const char的可修改指针,即指向常量字符。您可以使指针指向其他内容,但不能更改它指向的字符。换句话说,p = x是允许的,但*p = y不是。

char * const正好相反:指向可变字符的常量指针。允许*p = yp = x不允许。

const char * const是:指向常量字符的常量指针。

关于static:这给出了声明的变量内部链接(不能通过源文件外部的名称访问)。既然你在询问C和C ++,请注意这是它们的不同之处。

在C ++中,声明为const且未显式声明为extern的变量默认具有内部链接。由于有问题的指针是const(我说的是第二个const),static在C ++中是多余的,并且没有做任何事情。

在C中不是这种情况,其中const变量不能用作常量表达式,默认情况下具有内部链接。因此,在C中,static必须提供test_script内部链接。

上面对static的讨论假定声明位于文件范围(C)或命名空间范围(C ++)。如果它在函数内部,则static的含义会发生变化。没有static,它将是函数中的正常局部变量 - 每次调用都有自己的副本。对于static,它接收静态存储持续时间,因此在函数调用之间保持不变 - 所有调用共享该一个副本。既然你在询问C和C ++,我就不打算讨论类范围了。

最后,你问“为什么指针代替字符”。这样,指针指向实际的字符串文字(可能在进程内存的只读部分中的某个位置)。这样做的一个原因是,如果您甚至需要在test_script(指向常量字符的常量指针的指针)的某个地方传递const char * const *。此外,如果源代码中多次出现相同的字符串文字,则可以对其进行共享。

另一种方法是声明一个数组:

const char test_script[] = "test_script";

这会将字符串文字复制test_script,以保证它有自己的数据副本。然后,您可以从sizeof test_script(包括终止NUL)在编译时学习长度。如果它是该字符串文字的唯一出现,它也会消耗更少的内存(不需要指针)。但是,由于它将拥有自己的数据副本,因此无法共享字符串文字的存储空间(如果在代码中的其他位置也使用它)。