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"
一个东西?和两者 pca
和 pcb
指向这个对象的第一个元素?
最佳答案
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
变量现在指向您可以修改的内存(通过 temp
或 pca
)。还要记住,这个字符串文字别名可能比最初想象的更微妙。代码段:
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/