【问题标题】:Why is it possible to pass a string as a char pointer为什么可以将字符串作为 char 指针传递
【发布时间】:2015-10-07 14:30:34
【问题描述】:

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

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

所以最后会发生在我使用fopen(file, "a+")Save 方法内部,它工作得非常好。

但是我不明白它如何接受"log.txt"char *file

【问题讨论】:

  • 你在使用 c 编译器吗?
  • @Azad 我正在使用 C++ 编译器
  • 不懂的地方能说清楚点吗?为什么你认为它不应该被接受?是关于字符串与指针的问题还是关于 const 指针与非 const 指针的问题?

标签: c++ string pointers


【解决方案1】:

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

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

当作为参数传递时,衰减指向指针,根据 §4.2/1:

“N T 的数组”或“T 的未知边界数组”类型的左值或右值可以转换为“指向 T 的指针”类型的纯右值。结果是指向数组第一个元素的指针。

char const* 的原因可以分配给char* is mostly there for backward compatibility reasons 和它has been deprecated in C++11

【讨论】:

  • char const[N] 还是const char[N]?不记得数组是否有区别(但我相信指针有区别)
  • @AlejandroDíaz 没有区别。如果在* 之前或之后有const 时的区别,在这种情况下,它分别指的是值或指针的常量。
【解决方案2】:

"log.txt" 不是std:string 实际上是一个包含{'l','o','g','.','t','x','t','\0'} 的字符数组,它的类型是const char[N],它衰减为const char*,因此对Save(i, "log.txt"); 的调用有效。

调用有效,但编译器会打印一条警告,指出从 const char* 转换为 char* 在 C++03 中已被弃用,在 C++11 中无效。

【讨论】:

  • 当函数期望char * 时,他的问题不是为什么const char * 被接受吗?
  • @Slava 可能是。我说不出来。
【解决方案3】:

在 C++ 中,用字符串字面量初始化字符指针是非常好的。 初始化后,我们可以像使用数组一样使用字符指针:

{
  char *s="abc";
  cout<<s[0];
  cout<<s[1];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 2011-10-11
    • 2021-09-26
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    相关资源
    最近更新 更多