关于创建C++字符指针的故事

93 阅读2分钟

傻瓜问答

Q: 我创建了一个指针,这个指针的value是"hello",这么写对吗

char* _data;
_data = "hello";

// 可简写为 char* _data = "hello";

A: 这段代码定义了一个名为 _data 的字符指针,并将其赋值为指向字符串常量 "hello" 的地址。这使 _data 指向字符串常量,可以使用 _data 来访问该常量字符串。然而,这样有个潜在问题

Q: 什么问题?

A: 字符串 "hello" 是一个字符串字面值,它是一个常量字符串。然而,char* 类型的指针 _data 是一个非常量指针,它可以指向一个字符数组。尽管这段代码可以编译通过,但它违反了类型的匹配。应该改成:

const char* _data = "hello";

Q: 指针可以指向不同字符串吗?

A: 可以。但注意_data指向的是一个常量字符串,不可被修改。所以在代码中修改 _data 指针的指向不会修改原始的字符串内容,只是改变了指针指向的地址,使其指向 "world" 所在的地址

const char* _data = "hello";
_data = "world";

Q: 我想对对字符串进行修改,怎么做

A: 使用字符数组而不是指向常量的指针。因为字符串常量在C++中以空字符 ('\0') 结尾,所以这将创建一个大小为 6(包括字符串结尾的空字符 '\0')的字符数组 _data,可以对其进行修改。

char _data[] = "hello";

Q: 那下面的代码对吗? 不对的话为什么

char* _data = 'H';

A: char* 定义的是一个指针,指向的是一片区域,而'H'是一个字符。

Q: 怎么改

A: 如下

char _data = 'H';

Q: 上面的 _data 需要手动删除吗

A: _data 是一个指向字符串常量的指针,无需使用 delete,因为字符串常量的内存是静态分配的,不需要手动释放。

动态分配内存

char* _data = new char[10];  // 通过 new 动态分配内存

使用 new 运算符分配内存时,必须在不再需要该内存时使用 delete 运算符显式地释放内存,以避免内存泄漏

delete[] _data;  // 删除动态分配的内存

Q: 为什么要加[]

A: 看这里