为什么可以将字符串作为char指针传递

时间:2015-10-07 14:30:35

标签: c++ string pointers

我有一部分代码,我不明白它是如何工作的。

我有int Save(int _key, char *file); 此方法Save接受字符串作为char指针Save(i, "log.txt");

所以最后发生的事情是在我使用Save的{​​{1}}方法中,它完全正常。

但是,我不明白它对fopen(file, "a+")接受"log.txt"的方式。

3 个答案:

答案 0 :(得分:8)

字符串文字"log.txt"的类型为char const[N],符合§2.13.5/ 8:

  

普通字符串文字和UTF-8字符串文字也称为窄字符串文字。窄字符串文字的类型为“n const char数组”,其中n是下面定义的字符串大小,并且具有静态存储持续时间(3.7)。

根据§4.2/ 1,

衰减到指针时作为参数传递

  

“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];
}