【问题标题】:Why strings can be used like this为什么字符串可以这样使用
【发布时间】:2021-04-05 11:27:06
【问题描述】:

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++ pointer-arithmetic


【解决方案1】:

根据 C++ 14 标准(5.2.1 下标)

1 后缀表达式后跟方括号中的表达式是 后缀表达式。其中一个表达式应具有类型 “T 数组”或“指向 T 的指针”,另一个应为无范围的 枚举或整数类型。结果是“T”类型。 “T”型 应该是一个完全定义的对象类型。64 表达式 E1[E2] 是 与 *((E1)+(E2)) 相同(根据定义) [注:见 5.3 和 5.7 * 和 + 的详细信息以及数组的详细信息 8.3.4。 — 尾注],除了 在数组操作数的情况下,如果该操作数是,则结果是左值 一个左值和一个 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', '\0' };

在带有解引用运算符 * 或下标运算符 [] 的表达式中使用它们将转换为指向它们的第一个 const char * 类型元素的指针。因此这种说法

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

输出字符串文字"Hello"的第一个字符。

【讨论】:

    【解决方案2】:

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

    这是数组索引的操作——获取数组元素的值。在 C/C++ 中,普通数组通常仅由指针表示。此操作允许在 B'th 索引处读取数组 A 的值。

    只是取消引用运算符*A 与说*(A + 0) 相同。因此A[0]*A 的作用相同。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    相关资源
    最近更新 更多