当我这样做时-
#include <iostream>
int main(){
char *p = "Hello";
}
它工作正常,但是可以
#include <iostream>
int main(){
char *p = 'H';
// OR
int *x = 5;
}
出现错误:从'char'到'char *'的无效转换[-fpermissive] /'int'到'int *'
答案 0 :(得分:0)
这里的问题是C ++是一种强类型语言。您必须确保=
右边的类型与左边的类型相同(或者有一些定义明确的转换,允许编译器在类型之间进行转换)。
因此,我们需要知道什么是类型文字:使用双引号创建类型为char const[]
的字符串文字,而使用单引号创建类型为char const
的字符文字。
在const
部分,您将不得不忍受我。这使讨论变得更加复杂,因此我们将首先对其进行介绍。
我们还需要知道,在表达式中使用数组时,它们很容易衰减为指针。因此,在大多数情况下,char const[]
的类型会衰减为char const*
。
这应该有效:
char const* p = "Hello"; // This is valid.
// Both left and right sides have the same type.
// After you consider the array decay into a pointer.
另一方面
char const* p = 'H'; // The type on the right is `char const'
// While the type on the right has a pointer in it.
现在这里有一些自动转换在起作用。
在原始的C ++ 03中,允许编译器将字符串文字从char const*
自动转换为char*
。这是旧C语言的遗迹,它对类型检查的要求不如C ++现在严格。为此:
char* p = "Hello"; // Because there is an auto conversion
// the compiler is allowed to make
// the conversion from one type to another
请注意,在更高版本的C ++中,不建议使用此转换。因此,编译器会警告您这很危险(因为您已从允许修改它的类型中删除了const,但是无法修改基础对象,因此如果尝试,它将使程序崩溃)。>
那为什么要为char const
分配char
?
char x = 'X';
在这里,您要将原始对象char const
复制到类型为char
的对象中,这是完全有效的。您不能更改文字或给该文字加上机会,但可以复制它。因此,您可以轻松地删除赋值表达式中的外部const
。
char const* const y = "Hello";
char const* z = y; // We remove the outer const
// from a pointer. But the inner
// const (of the object being pointed
// at) can not be removed so easily.
// This works because z is allowed to
// to be changed but hold a value a pointer
// to a value that can not be changed.
查看您的评论:
#include <iostream>
void test(char *str)
{
std::cout << str << std::endl;
}
int main()
{
test("Hello"); // This is allowed in C++
// Deprecated still means valid.
// Just not a good idea
// There is a allowed conversion from
// char const* to char* for string literals.
char const* x = "test";
test(x); // This is NOT allowed.
// You can not cast away this const.
}
注意:从技术上说,字符串文字是char const[]
。即const char数组。 但是在表达式数组中使用时,很容易衰减为指针,因此有时将它们视为char const*
会更简单,但是这种想法是抽象的,您应该知道底层的确切类型。 / p>