加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 静态常量字符指针以及为何以这种方式使用它

发布时间:2020-12-16 09:56:53 所属栏目:百科 来源:网络整理
导读:static const char* const test_script = "test_script"; 您何时以及为何使用上述声明? 它有什么好处吗? 为什么使用char *而不是常量字符? “常量字符指针”(const char *)已经是常量,无法更改;那么为什么在前面使用静态这个词呢?它有什么用呢? 解决方
static const char* const test_script = "test_script";

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

为什么使用char *而不是常量字符?
“常量字符指针”(const char *)已经是常量,无法更改;那么为什么在前面使用静态这个词呢?它有什么用呢?

解决方法

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),静态在C中是多余的,并且不做任何事情.

在C中不是这种情况,其中const变量不能用作常量表达式,并且默认情况下没有内部链接.所以在C中,静态是提供test_script内部链接所必需的.

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

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

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

const char test_script[] = "test_script";

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读