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++报错 @AmeerAliconst
是“常数”的缩写。这意味着,一个不能被修改的值。 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 *数组能够指向每个元素中的字符串?
如何使用 UTF-8 字符序列在 C++ 中初始化 const char* 和/或 const std::string?