char* = "literal"

来源:5-8 字符串的指针表示

avoidOverfitting

2020-11-10

老师好。我在VS19中,有这样的报错 char* ptrS = "literal" ERROR: a value of type “const char[8]” cannot be used to initialize an entity of type “char*” 但是老师您上课就可以编译过这个。是因为您用的版本比较早,所以支持这种C-type的规则吗?而现在非要用char[]的话,一般写成:

//style-1
char strArr[] = "literal"; //means init stack-variable strArr[] with "literal"
char* ptrS = strArr; // ptrS points to strArr[]
// style-2
const char* s = "literal"; //means a const ptr pointing to a const literal

我自己查cppreference.com发现了这个:
图片描述
因该就是下面这种用一个char*指向各种string literal的用法被放弃了吧?

//C-style (deprecated)
char* ptrS = "literal0";
ptrS = "literal1";

并且C也不支持char[] 直接用= 来assign新的literal,所以就是cpp11以后最好用String来操作literal了么?就像这样:

// std::string, which uses operator overloading for re-assignment
string str = "literal0";
str = "literal1";

抱歉问题有点长,就是想确认一下我的理解是不是正确的。多谢!

写回答

1回答

quickzhao

2020-11-10

是的, char* ptrS = "literal"这个语法是deprecated了,这里存在一个隐式类型转换;所以新的编译器标准已经放弃了。老式的C方式转换确实有很多问题,除非你做很底层的C开发,否则建议使用标准库的string。

0
1
avoidOverfitting
谢谢您。
2020-11-10
共1条回复

重学C++ ,重构你的C++知识体系

一部大片,一段历史,构建C++知识框架的同时重塑你的编程思维

3976 学习 · 1110 问题

查看课程