const char* 如何不仅仅是一个字符? [关闭]

Posted

技术标签:

【中文标题】const char* 如何不仅仅是一个字符? [关闭]【英文标题】:How is a const char* not a just a character? [closed] 【发布时间】:2017-06-19 15:23:19 【问题描述】:

我对此感到非常困惑,因为就个人而言,我来自 java 背景,最近开始接触 c++。所以,我学会了所有基本的东西,比如把东西打印到屏幕上等等,现在,我学会了指针。所以,youtube 上的人(The Cherno's C++ Pointer tutorial 这不是他声明 const char* 的视频,只是我遵循的指针教程。)我一直在关注的是使用以下语句来声明我所知道的 '字符串'。

const char* str = "random text here";

但是,char* 是如何转换成字符串的,它甚至像字符串一样使用双引号!另外,常数与这些有什么关系?如果我从代码中删除const,它会给我一个错误。但是,我明白指针是什么。它是一个保存另一个变量的内存地址的变量,因此如果要直接访问该变量,他们只需要执行*ptrVarName 并取消引用它。但是字符串"like this one"怎么可能是内存地址呢? 我不需要做这样的事情吗?

char[] str = "string here";

然后做:

char* stringPointer = *str;

(警告:未经测试的代码!)

提前致谢。 (哦,很抱歉,如果这是一个非常NOOBY 的问题或者问题的结构很差,我刚开始使用c++ 和***)

编辑:好的,我明白char* str 的含义。这意味着当您引用*str 时,这意味着您正在访问内存中的第一个字符。好的,我现在明白了。但是,const 是什么意思?

【问题讨论】:

听起来你可以使用good C++ book。您可以从其中一个随机在线教程中获得更完整的教育。 如果你使用 C++,为什么不使用std::string 确实,从T*,我们无法知道对象是一个还是多个。 【参考方案1】:
const char* str = "random text here";

在右侧,"random text here" 定义了一个字符串文字,它实际上是一个 const char[17] 类型的数组(包括空终止符)。当您将该数组分配给const char* str 时,它会将decays 分配给指向第一个字符的指针。您不能通过指针修改字符串文字,因为字符串文字存储在只读内存中,因此以下内容将是非法的:str[0] = 'x';

char[] str = "string here";

这个不一样。它定义了char 数组str,它与右侧的字符串文字(const char[12])具有相同的大小。字符串文字将被复制到数组str 中,因此您将能够修改str。在这种情况下,写str[0] = 'x'; 是合法的。

【讨论】:

【参考方案2】:

如果你声明 const char* sth ="mystring" 它将 mystring 放在内存中,并指向它的工作,就像数组一样,但可以直接访问内存

【讨论】:

但是你还没有回答我的子问题“const 是什么意思?” 正如 petar velv 所说的净它们没有区别 但是,当我使用 char* str = "some text"; c++报错 @AmeerAli const 是“常数”的缩写。这意味着,一个不能被修改的值。 const MyType foo = ...; 声明一个 foo 持有一个不能被修改的 MyType 类型的值。 const MyType* bar; 声明 bar 持有一个指向 MyType 类型值的指针,该值不能被修改。请注意,在第二种情况下,指针bar可能会被修改。不能修改的是bar指向的东西。 因为 "mystring" 是 const 并且不能把它变成非 const 【参考方案3】:

这些是普通的 C 字符串。 C 字符串始终以空值结尾。换句话说,它最后有'\0'。所以你只需要内存中字符串开始的地方,你可以找到它的结束时间。

对于指针算术,这些 [] 括号只是语法糖。 str[]*str 相同,str[1]*(str+1) 相同,只是将指针加一char(8 位)并获取第二个元素的地址。

【讨论】:

Ameer - 你真的需要一本好书并阅读有关指针和指针算术的知识。 (*str)+1 表示“取消引用指针str 并将结果加一。*(str+1) 表示“将1*sizeof(str) 添加到指针str然后 取消引用” 是的,我明白了。当我在我的文本编辑器中尝试某些东西时,我意识到,然后我就明白了。无论如何,我破产了,没有钱买书;(【参考方案4】:

C 并没有真正的字符串。字符串是一个字符数组,以 nul (0) 结尾。现在 C 中的数组和指针紧密相连,char * 或 const char * 通常指向一个字符串,但与其他指针通常指向数组的方式相同。一个单独的 char * 可能只指向一个字符,你必须从上下文中知道,就像一个 int * 可能指向一个整数或一个整数数组一样。

因为字符串很方便,所以字符串字面量有一个特殊的语法规则。引号中的字符串文字变成 const char *(实际上它的类型是 char * 以实现向后兼容性)。所以从这个意义上说,C 有字符串。但是发生的只是字符串被放置在程序的数据部分,然后它的地址被占用了。

【讨论】:

以上是关于const char* 如何不仅仅是一个字符? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何将 const char * 数组项添加到 const char * 字符串?

请问C语言如何把2个const char * const s1的字符串合并?

const数组如何只能在每个元素中包含字符,但char *数组能够指向每个元素中的字符串?

如何在 C++ 中将字符串转换为 const char[]

将 const char* 转换为 LPCTSTR

如何使用 UTF-8 字符序列在 C++ 中初始化 const char* 和/或 const std::string?