静态常量字符指针及其以这种方式使用的原因
Static constant character pointer and why it's used in this fashion
static const char* const test_script = "test_script";
您何时以及为什么会使用上述语句?
有什么好处吗?
为什么使用 char*
而不是常量字符?
A "constant Character pointer" (const char*
) 已经是常量,无法更改;那为什么前面要用static
这个词呢?它有什么好处?
A const char *p
不是 常量指针。它是指向 const char
的可修改指针,即指向常量字符。您可以使指针指向其他对象,但不能更改它指向的字符。换句话说,p = x
是允许的,但*p = y
是不允许的。
A char * const
则相反:指向可变字符的常量指针。 *p = y
是允许的,p = x
是不允许的。
A 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++,因此我不打算讨论 class 范围。
最后,您问 "why pointer instead of characters." 这样,指针指向实际的字符串文字(可能在进程内存的只读部分中的某处)。这样做的一个原因是,如果您甚至需要在需要 const char * const *
(指向常量字符的常量指针的指针)的地方传递 test_script
。另外,如果相同的字符串字面量在源代码中出现多次,可以共享。
另一种方法是声明一个数组:
const char test_script[] = "test_script";
这会将字符串文字复制到test_script
,保证它有自己的数据副本。然后,您可以在编译时从 sizeof test_script
(包括终止 NUL
)中了解长度。如果它是该字符串文字的唯一出现,它也会消耗稍微少一点的内存(不需要指针)。但是,由于它将拥有自己的数据副本,因此它无法共享字符串文字的存储(如果它也在代码的其他地方使用)。
static const char* const test_script = "test_script";
您何时以及为什么会使用上述语句? 有什么好处吗?
为什么使用 char*
而不是常量字符?
A "constant Character pointer" (const char*
) 已经是常量,无法更改;那为什么前面要用static
这个词呢?它有什么好处?
A const char *p
不是 常量指针。它是指向 const char
的可修改指针,即指向常量字符。您可以使指针指向其他对象,但不能更改它指向的字符。换句话说,p = x
是允许的,但*p = y
是不允许的。
A char * const
则相反:指向可变字符的常量指针。 *p = y
是允许的,p = x
是不允许的。
A 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++,因此我不打算讨论 class 范围。
最后,您问 "why pointer instead of characters." 这样,指针指向实际的字符串文字(可能在进程内存的只读部分中的某处)。这样做的一个原因是,如果您甚至需要在需要 const char * const *
(指向常量字符的常量指针的指针)的地方传递 test_script
。另外,如果相同的字符串字面量在源代码中出现多次,可以共享。
另一种方法是声明一个数组:
const char test_script[] = "test_script";
这会将字符串文字复制到test_script
,保证它有自己的数据副本。然后,您可以在编译时从 sizeof test_script
(包括终止 NUL
)中了解长度。如果它是该字符串文字的唯一出现,它也会消耗稍微少一点的内存(不需要指针)。但是,由于它将拥有自己的数据副本,因此它无法共享字符串文字的存储(如果它也在代码的其他地方使用)。