【问题标题】:passing a string to a function using character pointer使用字符指针将字符串传递给函数
【发布时间】:2015-06-03 15:43:35
【问题描述】:

大家好,请看一下这段代码。

class person
{
 char name[20];
 float age;

 public:
 person(char *s,float a)
  {
   strcpy(name,s);
   age=a;
  }
};

int main()
{
person P1("John",37.50);
person p2("Ahmed",29.0);
}

所以在这个类中,参数化构造函数将一个字符指针作为参数,然后将其传递给 strcpy 函数,该函数将字符串复制到字符数组名称。 如果有整数数组,如 int arr[10]; 那么 arr 是指向第一个元素的指针。 如果有一个字符数组是一个字符串,比如 字符 str[]="你好"; 那么 str 是指向第一个元素的指针,在这种情况下是 h。那么我们不应该将 str 之类的东西传递给构造函数吗?为什么我们将字符数组元素(如“john”、“ahmed”)传递给构造函数。 我们不应该这样做—— 字符 str[]="艾哈迈德"; 人 p1=(str,23);

【问题讨论】:

  • 数组衰减为指针,所以它们是一样的
  • 这是无效的 C++11。不再允许将字符串文字转换为 char*。如果需要 C 字符串,s 应该是 const char *
  • 既然这应该是 C++ 那你为什么不使用 C++ std::strings 呢? Old skool C 弦乐 (char *) 是一个痛苦的世界。
  • char str[] = "Hello";中,str是一个数组;一个包含"Hello" 元素的副本。它不是指针,尤其不是指向"Hello" 的第一个元素。无论您是以字符串文字的形式传递数组还是以任何其他数组的形式传递数组,它们都会衰减为指向第一个元素的指针。

标签: c++ string function


【解决方案1】:

"John""Ahmed" 之类的字符串字面量传递给函数/方法意味着您正在传递指向其第一个字符的指针。

【讨论】:

    【解决方案2】:

    从编译器的角度来看,

    char str[];
    char *str;
    

    都被解释为指向 char 的指针。

    鉴于函数原型 person(char *s,float a) 和函数调用 person("John",37.50)(在您的情况下,它是一个被调用的构造函数,但同样适用),编译器实际生成的内容类似于:

    char *s = "John";
    float a = 37.50;
    person(s,a);
    

    更准确地说,上面的示例代码和函数调用person("John",37.50) 应该生成相同的指令。

    【讨论】:

      【解决方案3】:

      在这种情况下没有真正的理由使用原始字符串。由于您声明了class,因此您显然也不需要与 C 编程语言兼容。因此,只需使用 ::std::string,您的代码将更具可读性,并且在某些情况下由于移动语义(自动使用 ::std::string 类型)甚至更快。

      #include <string>
      
      class person
      {
        ::std::string name;
        float age;
      
      public:
        person(::std::string name, float age)
        : name(name)
        , age(age)
        {
        }
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多