我想知道是否可以将指向 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/