为什么字符串可以这样使用



C++代码

string *stra;
string strb = "ABC";
stra = &strb;
std::cout <<  stra[0][1] << std::endl;
std::cout << *stra << " " << stra[0]<< std::endl;

为什么使用stra[0]*stra打印相同,或者为什么我可以像使用一样使用

根据C++14标准(5.2.1订阅(

1后缀表达式后面跟一个方括号中的表达式是后缀表达式。其中一个表达式的类型应为"T的数组"或"指向T的指针",而另一个应未缩放枚举或积分类型。结果属于"T"类型应为完全定义的对象类型。64表达式E1[E2]为(根据定义(与*(((E1(+(E2((相同[注:见5.3和5.7*和+的详细信息以及8.3.4的数组详细信息。——尾注],除在数组操作数的情况下,如果该操作数为否则为lvalue和xvalue。

因此表达式stra[0]的求值类似于*( stra + 0 ),与*stra相同。

注意,由于运算+是可交换的,则此表达式*( stra + 0 )*( 0 + stra )相同。这意味着您甚至可以编写0[stra]而不是stra[0]

这里有一个演示程序,它使用字符串litarals来代替std::string类型的对象。

#include <iostream>
int main() 
{
std::cout << "Heelo"[0] << ' ' << *"Hello" << 'n';

return 0;
}

程序输出为

H H

C++中的字符串文字由常量字符数组表示。例如,字符串文字"Hello"像未命名的字符数组一样存储

const char unnamed_string_literal[] = { 'H', 'e', 'l', 'l', 'o', '' };

在带有取消引用运算符*或下标运算符[]的表达式中使用时,它们被转换为指向const char *类型的第一个元素的指针。因此,

std::cout << "Heelo"[0] << ' ' << *"Hello" << 'n';

输出字符串文字CCD_ 14的第一个字符。

根据定义(也如@MikeCAT所述(,操作A[B](对于普通数组(定义为*(A + B)

这是数组索引的操作——获取数组元素的值。在C/C++中,普通数组通常只由一个指针表示。该操作允许在第B个索引处读取阵列A的值。

只是取消引用运算符*A和说*(A + 0)是一样的。所以CCD_ 19和CCD_。

相关内容

  • 没有找到相关文章

最新更新