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_。