静态常量字符指针及其使用方式的原因
Static constant character pointer and why it's used in this fashion
static const char* const test_script = "test_script";
您何时以及为什么要使用上述语句?它有什么好处吗?
为什么使用char*
而不是常量字符?"常量字符指针"(const char*
)已经是一个常量,不能更改;那为什么要在前面使用static
这个词呢?它有什么好处?
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
)中学习长度。如果它是该字符串文本的唯一出现,它还会消耗略少的内存(不需要指针)。但是,由于它将拥有自己的数据副本,因此它无法共享字符串文本的存储(如果代码中的其他地方也使用该存储)。
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 什么时候在C++中返回常量引用是个好主意
- 如何在c++中为模板函数实例创建快捷方式
- 代理对象的常量正确性
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 通过多个头文件使用常量变量
- 在cuda线程之间共享大量常量数据
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 是否可以使用非常量指针调用非常量函数,以及当两个unique_ptrs指向同一个对象时程序的行为方式?
- 以简单的方式修改常量字符 * 与字符 * 内容
- 跨平台套接字发送,Linux 上的缓冲区常量无效* Windows上的常量字符*,最佳处理方式
- 常量标识符在C++中有不同的处理方式吗
- 静态常量字符指针及其使用方式的原因
- 为什么不能以与指针相同的方式返回常量引用
- 在命名空间中定义双常量的最佳方式是什么
- 我可以用这种方式将数组转换为指针并返回指向常量的指针吗?
- 将常量参数传递给CUDA内核的最快(或最优雅)的方式
- 我可以以非常量的方式使用 Boost.Range 索引适配器吗?