char变量参数如何接收字符串?

时间:2019-09-07 17:47:50

标签: c++ parameters

假设一个函数带有一个const char*类型的参数。当我在调用该函数时使用字符串时,不会出错!我希望您只能输入ASCII中包含的字符,例如c或dec 68,但是似乎不是这样。看看下面的代码...

void InitFunction(const char* initString)
{
  std::cout << initString;
}

int main()
{
  InitFunction("Hello!");
}

运行代码时,不会出现任何问题,警告或错误。从下面可以看到,我对此进行了更多测试。

void InitFunction(char initString)
{
  std::cout << initString;
}

int main()
{
  InitFunction("Hello!");    // compiler error on this line
}

由于Hello!无法转换为char,因此编译时出错。我尝试了另一项测试,但使用const char作为函数参数类型。该代码仍然会编译并出现错误。但是,当我将*添加到函数参数类型时,一切都可以编译了!在我看来const也是必要的。

据我对指针的理解,该函数正在请求一个指针,并且该指针被标识为字符。但这给我带来了三个问题。

  • 首先,Hello!的形式不是指针。我希望至少必须使用引用运算符(&)。

  • 第二,Hello!不是char类型。

  • 第三,为什么我们需要包含const

我在这里错过了什么吗?指针和字符是否以我不知道的方式工作?

2 个答案:

答案 0 :(得分:3)

"Hello!"const char个字符数组。数组被视为指针,当在函数调用中用作参数时,它们会衰减为指针。 C ++标准对此进行了指定,以便与C语言标准指定要处理的数组的方式兼容。

在其他情况下,使用数组或指针或地址运算符的情况(例如赋值语句),会发生此数组衰减为指针的情况。另请参见Arrays are Pointers?

因此,"Hello!"将作为指针放入InitFunction()的参数列表中,该指针指向编译器存储字符数组并添加了终止零字符的位置。当编译器为函数调用生成代码时,用作函数参数的字符数组的指针为const char *,指向char的指针为const,并且应该不可更改。

当函数原型为InitFunction(const char *)时,编译器可以使用诸如InitFunction("Hello!");之类的函数调用。您正在做的是提供指向const char *的{​​{1}}。

但是,如果删除"Hello!",则由于const"Hello!",编译器会抱怨。编译器抱怨,因为在函数调用中使用了const变量,该变量的参数列表为非常量,这表明函数可能会更改指针所指向的内容。自“你好!”不应更改,因为它是const,所以编译器会发出错误。

如果删除星号,请将const更改为const char *,则由于const char"Hello!"数组,编译器随后将其衰减为指向的第一个元素的指针数组时,编译器会在您试图将指针用于非指针参数时抱怨。在此替代方案中,问题是实际数据类型,问题是charchar

以下几行代码也可以接受:

char *

请注意,C ++具有实际的字符串类型const char *p = "Hello!"; // create a pointer to an series of characters char x1[] = "Hello!"; // create an array of char and initialize it. char *p2 = x1; // create a pointer to char array and initialize it. char *p3 = x1 + 2; // create a pointer to char array and initialize it with address of x1[2]. InitFunction (p); // p is a const char * InitFunction (x1); // x1 decays to a char * InitFunction (p2); // p2 is a char * InitFunction (p3); // p3 is a char * InitFunction (x1 + 3); // called with address of x1[3]. ,该类型会导致动态字符串文本,其基本物理内存布局通常包含指向字符数组的指针。标记为字符串的C样式字符数组与C ++ string类型不同。

答案 1 :(得分:2)

  

该函数正在请求一个指针

正确。

  

并且指针被识别为字符

否,指针不是字符。指针是指针。该指针指向一个或多个字符,即一个字符数组。这正是您的字符串文字。

  

首先,您好!不是指针形式。

是的。字符串文字"Hello!"的类型为const char[7],它会衰减为指针。

  

我希望至少必须使用引用运算符(&)。

那是运算符的地址。您并不总是需要它来获取指针。例如:this

  

第二,您好!不是char类型。

不,但是每个组成字符都是。

  

第三,为什么我们需要包含const?

因为字符串文字"Hello!"的类型为const char[7]。丢弃const会违反const-正确性,因此是不允许的。

  

自您好以来,这引发了错误!无法转换为char。

是的。 char是一个字节。字符串"Hello!"不是一个字节。这是一个字符串。


通常/通常/通常以const char*形式提供C字符串。

您应该阅读本书中有关该主题的章节,因为这是该语言的基础。它与ASCII无关(文本编码与存储字节序列无关)。