为什么char *和int *的行为不同

时间:2013-10-27 15:20:01

标签: c++ pointers char int

以下给定的程序存在一些疑问。任何讨论都有助于理解内部。

#include <iostream>
using namespace std;

int main() {
    // your code goes here

    char* ptr = new char[11];
    ptr = "helloworld";
    cout << ptr;

    int* ptr1 = new int[2];
    //ptr1 = {12, 24};
    cout << ptr1;

    return 0;
}
  1. cout&lt;&lt; PTR;打印helloworld(打印价值); cout&lt;&lt; ptr1打印地址而不是值。为什么??
  2. 由于cout&lt;&lt; PTR;打印值,如何获取新char [11]分配给ptr的地址。
  3. 如果ptr =“helloworld”;被允许。为什么ptr1 = {12,24};是不允许的?

2 个答案:

答案 0 :(得分:5)

你问题的核心是为什么&lt;&lt; operator在一个case中输出一个字符串,在另一个case中输出一个地址这是来自它的c语言遗产,其中没有“真正的”字符串类型。在c / c ++中,char *和char []被唯一地处理,通常被假定为'字符串'。假定其他类型的数组是该类型的数组。因此,在输出char *时,&lt;&lt;假设你想要一个字符串输出,而使用int [],它输出数组的地址而不是它的内容。简单地说,char []和char *在许多输出函数中被视为特殊情况。

我可以看到你对编译器处理源代码的方式也有一些困惑。考虑:

char* ptr = new char[11];
ptr = "helloworld";

此代码分配11个内存的char并将ptr设置为该分配的地址。下一行创建一个常量“helloworld”,它被分配和初始化,并将ptr设置为该内存的地址。你有两个内存位置,一个有11个未初始化的字符,一个初始化为“helloworld \ 0”。

答案 1 :(得分:0)

您的代码存在严重问题,这是内存泄漏。您分配内存并将其分配给ptr,但随后重新分配以使其指向其他位置。如果您希望内存包含字符串,则必须将其复制到已分配的内存中。

语言不允许使用“文字数组”,除非在声明中初始化数组。