c++ - 为什么 char* 和 int* 表现不同

标签 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 << ptr;打印 helloworld(打印值); cout << ptr1 打印地址而不是值。为什么??
  2. 因为 cout << ptr;打印值,如何获取 new char[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”,它被分配和初始化并将 ptr 设置为该内存的地址。您有两个内存位置,一个有 11 个未初始化的字符,另一个初始化为“helloworld\0”。

关于c++ - 为什么 char* 和 int* 表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19619682/

相关文章:

c++ - 如何在 GCC 4.5 中使用 C++0x 原始字符串?

c - 将 char *[] 数组传递到采用参数 const char ** 的函数中

c++ - 如何有效地存储矩形网格?

c++ - 在 QTCreator GUI 中播放视频

c++ - const - 它不应该改变吗

C 用另一个替换字符数组中的一个字符

java - 我如何获取 TextField 输入,获取每个字母,并将其放入字符中?

c - 如何将现有字符串中包含的 (ASCII) 字母字符复制到新字符串中

c++ - 将现有 C++ 源代码导入 Visual Studio

c++ - 线程: I want to pass a struct pointer in main to a function called by pthread