我有一部分代码,我不明白它是如何工作的。
我有int Save(int _key, char *file);
此方法Save
接受字符串作为char指针Save(i, "log.txt");
所以最后发生的事情是在我使用Save
的{{1}}方法中,它完全正常。
但是,我不明白它对fopen(file, "a+")
接受"log.txt"
的方式。
答案 0 :(得分:8)
字符串文字"log.txt"
的类型为char const[N]
,符合§2.13.5/ 8:
根据§4.2/ 1,普通字符串文字和UTF-8字符串文字也称为窄字符串文字。窄字符串文字的类型为“n const char数组”,其中n是下面定义的字符串大小,并且具有静态存储持续时间(3.7)。
将衰减到指针时作为参数传递
:“N T数组”或“未知T的数组”类型的左值或右值可以转换为“指向T的指针”类型的prvalue。结果是指向数组的第一个元素的指针。
可以将char const*
分配给char*
is mostly there for backward compatibility reasons及其has been deprecated in C++11的原因。
答案 1 :(得分:5)
"log.txt"
不是std:string
实际上是一个包含{'l','o','g','.','t','x','t','\0'}
的字符数组,其类型为const char[N]
,它会衰减到const char*
因此调用Save(i, "log.txt");
有效。
调用有效,但编译器会打印一条警告,指出在C ++ 03中已弃用从const char*
转换为char*
而在C ++ 11中无效。
答案 2 :(得分:0)
在C ++中,用字符串文字初始化字符指针是完全正确的。 在初始化之后,我们可以像在数组中一样使用该字符指针:
{
char *s="abc";
cout<<s[0];
cout<<s[1];
}