c++ - 我可以将指向 char 指针的指针直接分配给字符串文字吗?

标签 c++ pointers string-literals

我想知道是否可以将指向 char 的指针直接分配给字符串文字,而无需首先将字符串文字分配给左值指针。通常,如果参数采用指向某物的指针,您可以使用 & 传递对象的地址,并且字符串文字似乎(或至少衰减为)char 指针,因为您可以将它们分配给 char 指针。这就是为什么我希望以下其中一项起作用:

const char ** ppchar = &"StringLiteral"; // This doesn't compile

const char ** ppchar = (const char **)&"StringLiteral"; // This compiles, but...

std::cout << *ppchar;   // Throws an exception

我希望至少其中的第二个能够工作,因为在我看来“StringLiteral”至少会衰减为一个指针,所以在:

const char** ppchar = (const char**) &"StringLiteral";

第一个指针将指向字符串文字的地址。如果首先将字符串文字分配给左值指针,则第一个指针将指向第二个指针,后者实际上保存着它的地址。对我来说似乎是一样的。

编辑:另外,看来我可以做到:

const char * _pptr = (const char*)&"StringLiteral";
std::cout << _pptr; // Prints "Hello"

因此似乎没有禁止直接赋值给字符串文字的规则。

编辑:对很多人来说显而易见的是,我的间接层次是错误的。来自莫斯科的弗拉德在他的回答中解释了这一点。在:

const char ** pptr = (const char**)&"StringLiteral";

编译器期望 pptr 指向存储 char 地址的东西,而我已经将它分配给“StringLiteral”本身的地址,这意味着当我 cout 时它取消引用第一个指针以查找找到哪个地址字符。问题是它直接指向“StringLiteral”的地址,这意味着它使用“StringLiteral”的第一个字母的值作为查找字符的地址,基本上它会使用“S”作为地址要去。讨厌这么厚。

最佳答案

这个表达式

&"StringLiteral"

在 C++ 中具有 const char( * )[14] 类型,在 C 中具有 char ( * )[14] 类型,因为字符串文字分别具有类型 const char[14]char[14]

因此您不能将这样的指针分配给 const char **char ** 类型的对象,因为指针不兼容。

如果您将尝试使用此声明中的转换

const char** ppchar = (const char**) &"StringLiteral";

尽管如此,像 *ppchar 这样取消引用这个指针是没有意义的,因为您将获得对应的值,而不是预期的 char * 类型的对象到字符串文字的第一个字符的值而不是地址值。

例如,您首先可以通过以下方式将字符串文字转换为类型 const char *(或 C 中的 char *)

StringLiteral + 0

因为在这样的表达式中,字符串文字被转换为指向其第一个字符的指针。但是,您不能将一元运算符 & 应用于此表达式,如

&( StringLiteral + 0 )

获取 const char ** 类型的对象,因为您不能将运算符应用于 rvalue

所以你可以做以下事情

const char *pchar = "StringLiteral";
const char **ppchar = &pchar;

关于c++ - 我可以将指向 char 指针的指针直接分配给字符串文字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46819323/

相关文章:

c++ - 拦截Windows中的Move命令

c++ - 在 Process::Start 中传递一个字符串

c++ - 可以将空字符串文字传递给用户定义的原始文字运算符吗?

c++ - 虚继承构造函数顺序

c++ - 纯虚方法调用 Error Google Protocol Buffer

arrays - 在 C 中初始化了一个指针数组 - 可能无法初始化可变大小的对象

c++ - 在 C++ 中使用指针的实际意义是什么?

c++ - 尽管使用等效语句但出现段错误的原因

c++ - 为什么 Utf-8 在 Qt 5 中无法工作?

c++ - 从单个定义创建字符串和宽字符串文字