为什么我们说'char * c =“ Hello”;在C ++中

时间:2019-04-10 17:36:11

标签: c++ pointers

当我这样做时-

#include <iostream>

int main(){
    char *p = "Hello";
}

它工作正常,但是可以

#include <iostream>

int main(){
    char *p = 'H';
    // OR
    int *x = 5;

}

出现错误:从'char'到'char *'的无效转换[-fpermissive] /'int'到'int *'

1 个答案:

答案 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>