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

Why char* and int* behaves differently

本文关键字:int char 为什么      更新时间:2023-10-16

下面有一些与给定程序相关的疑问。任何讨论都将有助于理解内部结构。

#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 <<PTR;打印 Helloworld (打印值);cout <<PTR1 打印地址不是值。为什么??
  2. 由于 cout <<ptr; 打印值,如何获取新字符 [11] 分配给 ptr 的地址。
  3. 如果 ptr = "helloworld"; 是允许的。 为什么 ptr1 = {12, 24}; 不允许?

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

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

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

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

您的代码存在一个主要问题,那就是内存泄漏。你分配内存并将其分配给ptr,但随后你重新分配它以使其指向其他地方。如果希望内存包含字符串,则必须将其复制到分配的内存中。

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