我想知道是否可以直接将指向char的指针分配给字符串常量,而不必先将字符串常量分配给左值指针。通常,如果参数需要某物的指针,您可以使用&传递对象的地址,而字符串常量似乎被(或至少衰减为)char指针,因为它们可以分配给char指针。这就是我期望以下之一能够工作的原因:
第一个指针将指向字符串字面量的地址。如果先将字符串字面量分配给左值指针,第一个指针将指向第二个指针,后者实际上保存了它的地址。对我来说是相同的。
编辑:另外,似乎我可以这样做:
编译器期望pptr指向存储char地址的内容,但我将其赋值为“StringLiteral”本身的地址。这意味着当我使用cout输出时,它会解引用第一个指针以查找哪个地址包含char。问题在于它直接指向“StringLiteral”的地址,这意味着它使用“StringLiteral”的第一个字母的值作为要查找char的地址,基本上它将使用“S”作为要去的地址。真恨自己这么蠢。
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"
所以似乎没有规则禁止直接赋值给字符串字面量。
编辑:正如许多人显而易见的那样,我的间接层级是错误的。这在Vlad from Moscow的答案中得到了解释。在:
const char ** pptr = (const char**)&"StringLiteral";
编译器期望pptr指向存储char地址的内容,但我将其赋值为“StringLiteral”本身的地址。这意味着当我使用cout输出时,它会解引用第一个指针以查找哪个地址包含char。问题在于它直接指向“StringLiteral”的地址,这意味着它使用“StringLiteral”的第一个字母的值作为要查找char的地址,基本上它将使用“S”作为要去的地址。真恨自己这么蠢。
const char[N]
,其中 N 是某个数字。因此,你需要将char const (*)[N]
强制转换为char const**
。你不能通过指针来别名数组。我已经在 Stack Overflow 上说过无数次了,数组不是指针,指针也不是数组。 - StoryTeller - Unslander Monica