比较char和const char *

时间:2011-10-18 13:58:34

标签: c++

string line = "blerdy blah";
for (int i = 0; i < string.size(); i++)
{

    line[i] != "n";
}

有了这个,我得到错误“无法从char转换为const char *”

如果我用

替换最后一行
line[i] != *"n";

有效。我明白为什么在某种意义上,我正在取消引用一个指针。我没有得到的是为什么它首先是一个指针。这样写的任何字母实际上都是指向某个字符的指针吗?就像程序在某处有一组每个符号一样,这就是我所指向的?

如果是这种情况,我可以做一些愚蠢的事情,比如让'n'指针指向其他东西吗?

6 个答案:

答案 0 :(得分:8)

在这种情况下,您必须将charchar进行比较:

line[i] != 'n';

当你说*"n"时,实际上取消引用了char数组的第一个元素,其中包含n\0元素,这会给你n,这就是它的工作原理,但你不想这样写。

答案 1 :(得分:5)

"n"不是字符文字,而是字符串文字。你想要'n'

答案 2 :(得分:2)

“n”是一个char数组(字符串)。虽然'n'是一个字符。

答案 3 :(得分:1)

"n"更改为'n'。区别在于前者是const char*而后者是char。由于您要将一个char与另一个{{1}}进行比较,后者是正确使用的形式。

答案 4 :(得分:1)

"n"是一个所谓的字符串文字,其类型为const char[2]string::operator[](实际上basic_string<char>::operator[]会返回const char&char&,具体取决于所选择的重载(在本例中为第二个)。您无法比较这些类型。您想要的是什么比较operator[]的结果是一个字符文字,写成'n'

关于第二个问题

"n"的类型为const char[2],取消引用它会为您提供char(数组中指向的第一个字符)。这相当于"n"[0]

答案 5 :(得分:0)

为什么以及如何运作

"n"开始:词法上它是一个以空字符结尾的字符串文字,这意味着编译器最终将其视为char*,指向包含字符串“n”的内存部分”

因此,当您撰写*"n"时,会发现您取消引用指向char*的{​​{1}},这意味着表达式的结果将为"n" (类型'n')。这就是与char(也是line[i])进行比较的原因。

这个指向char的指针是一个编译时常量(所以你不能改变它)并且很可能会指向一个只读的内存页面(所以你将无法改变它它在运行时指向。)。

你应该做什么

"n"