其他分享
首页 > 其他分享> > c – 我可以直接将指针指向char指针吗?

c – 我可以直接将指针指向char指针吗?

作者:互联网

我想知道是否可以直接将指向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”本身的地址,这意味着当我输出时它解引用第一个指针以找到哪个地址找到char.问题是它直接指向“StringLiteral”的地址,这意味着它使用“StringLiteral”的第一个字母的值作为查找char的地址,基本上它将使用“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,pointers,string-literals
来源: https://codeday.me/bug/20190828/1749993.html