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

Can I assign a pointer to char pointer directly to a string literal?

我想知道是否可以将指向 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 指向存储字符地址的东西,而我已将它分配给 "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;

除了很好的回答。

Can I assign a pointer to char pointer directly to a string literal?

差不多。在 C 中,代码可以使用 复合文字 形成一个 const char * 并用 字符串文字 初始化,然后获取该指针的地址分配给 ppchar.

const char **ppchar = &((const char *){"StringLiteral"});
puts(*ppchar);