数组中的 C++ 相等运算符

标签 c++ pointers

const char ca[]="test";
const char cb[]="test";

const char *pca="test"; //(*)
const char *pcb="test";

cout<<(ca==cb)<<endl; //0
cout<<(pca==pcb)<<endl; //1
我对这个结果很困惑。ca cb是不同的对象,在处理 ca==cb 时,它比较第一个元素的地址,所以 &ca[0]!=&cb[0] .
但我不明白 pca 的行为pcb .
(*) 是否相当于
const char temp[]="test";
const char *pca = temp;
?
"test"一个东西?和两者 pcapcb指向这个对象的第一个元素?

最佳答案

const char ca[]="test";
const char cb[]="test";
这将创建名为 ca 的新变量和 cb , 大到足以容纳初始化(不是赋值)中给出的字符串文字中的字符和终止符,然后将文字字符串的内容复制到每个字符串中。
const char *pca="test"; //(*)
const char *pcb="test";
这只是将字符指针设置为指向给定的字符串文字。一个实现可以自由地为这些文字使用相同的内存,有效地为多个目的对内存进行别名。它可以不受惩罚地做到这一点,因为无论如何尝试修改字符串文字都是未定义的行为。

关于您关于指针等效的最后一点:
const char temp[]="test";
const char *pca = temp;
事实并非如此。 pca变量现在指向您可以修改的内存(通过 temppca )。

还要记住,这个字符串文字别名可能比最初想象的更微妙。代码段:
cout << a << "is " << "invalid\n";
cout << b << "is " << "valid\n";
最终可能只会在内存中存储两个字符串文字:
Addr:
  0   1     2      3   4   5   6   7   8   9  10   11   12
+---+---+-------+----+---+---+---+---+---+---+---+----+----+
| i | s | <spc> | \0 | i | n | v | a | l | i | d | \n | \0 |
+---+---+-------+----+---+---+---+---+---+---+---+----+----+
和:
  • is<spc>被转换为使用地址 0;
  • invalid\n转换为使用地址4;和
  • valid\n正在转换为使用地址 6。

  • 而且,如果其他一些代码需要 id\n ,它可以只使用地址 9。

    关于数组中的 C++ 相等运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65802920/

    相关文章:

    python - 创建一个python列表,一个指针指向两个地方

    c++ - 使用动态分配的内存(指针)

    c++ - 访问冲突写入位置 0x00E1DCC4

    c++ - 访问使用接口(interface)实例化的类的私有(private)成员

    c++ - 用于自定义容器的 STL 兼容迭代器

    c++ - 如何告诉 C 或 C++ 编译器指针没有别名

    c++ - SFML 2.0 中需要的警告框功能

    c - 在 C 中打印未知字符,而不是破折号和空格

    c++ - 错误 : ‘NULL’ was not declared in this scope

    c++ - 你能举个例子说明什么时候真的需要 auto_ptr_ref 吗?