static const char* const test_script = "test_script";
您何时以及为何使用上述声明? 它有什么好处吗?
为什么使用char*
而不是常量字符?
A"常量字符指针" (const char*
)已经是一个常数,不能改变;那么为什么要在它前面使用static
这个词呢?这有什么用呢?
答案 0 :(得分:7)
const char *p
不是常量指针。它是指向const char
的可修改指针,即指向常量字符。您可以使指针指向其他内容,但不能更改它指向的字符。换句话说,p = x
是允许的,但*p = y
不是。
char * const
正好相反:指向可变字符的常量指针。允许*p = y
,p = 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
)在编译时学习长度。如果它是该字符串文字的唯一出现,它也会消耗更少的内存(不需要指针)。但是,由于它将拥有自己的数据副本,因此无法共享字符串文字的存储空间(如果在代码中的其他位置也使用它)。