假设一个函数带有一个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
?
我在这里错过了什么吗?指针和字符是否以我不知道的方式工作?
答案 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!"
数组,编译器随后将其衰减为指向的第一个元素的指针数组时,编译器会在您试图将指针用于非指针参数时抱怨。在此替代方案中,问题是实际数据类型,问题是char
与char
。
以下几行代码也可以接受:
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无关(文本编码与存储字节序列无关)。