string line = "blerdy blah";
for (int i = 0; i < string.size(); i++)
{
line[i] != "n";
}
有了这个,我得到错误“无法从char转换为const char *”
如果我用
替换最后一行line[i] != *"n";
有效。我明白为什么在某种意义上,我正在取消引用一个指针。我没有得到的是为什么它首先是一个指针。这样写的任何字母实际上都是指向某个字符的指针吗?就像程序在某处有一组每个符号一样,这就是我所指向的?
如果是这种情况,我可以做一些愚蠢的事情,比如让'n'指针指向其他东西吗?
答案 0 :(得分:8)
在这种情况下,您必须将char
与char
进行比较:
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"