为什么 char* 和 int* 的行为不同
Why char* and int* behaves differently
下面有一些与给定程序相关的疑问。任何讨论都将有助于理解内部结构。
#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;
}
- cout <<PTR;打印 Helloworld (打印值);cout <<PTR1 打印地址不是值。为什么??
- 由于 cout <<ptr; 打印值,如何获取新字符 [11] 分配给 ptr 的地址。
- 如果 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
,但随后你重新分配它以使其指向其他地方。如果希望内存包含字符串,则必须将其复制到分配的内存中。
语言不允许使用"文字数组",除非在声明中初始化数组。
相关文章:
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- C ++如何在使用"tolower"时将char转换为int
- 在标准中,模板参数的语法在哪里定义,例如,'std::function<int(char)>'?
- 类型为 'std::map< char,int > 的 <Swig 对象的代理
- 声明具有两种类型的变量:"int char"
- 定义.cpp中常数int/char*
- Qt5 对'QApplication::QApplication(int&, char**, int)'的未定义引用
- 将int/char插入数据库
- 从 std::vector 转换为<int> char[] C++
- 为什么INT(char)的比较不起作用
- 使用int+char组合uint8_t
- 为什么这个返回值?C++int/char混淆
- 向量到 int<char> 与向量<wchar_t>到 int
- Evaluate an int, char and int
- 接收错误"no matching function for call to 'getline(std::ifstream&, int&, char)'"
- reinterpret_cast<int*>(char*) vs. static_cast<int*>(static_cast<void*>(char*)) --
- 将类型int(C::*)(int, char)转换为类型int(int, char)
- 如何添加多位数的int和char,其中输出为int+char
- 是int, char也是抽象数据类型