我知道他们是不同的,我知道他们是如何不同的,我阅读了我能找到的关于char*char[]的所有问题

但所有这些答案都没有告诉我们什么时候应该使用它们.

所以我的问题是:

你什么时候用

const char *text = "text";

那你们什么时候用呢?

const char text[] = "text";

有什么指导方针或规则吗?

例如,哪一个更好:

void withPointer()
{
    const char *sz = "hello";
    std::cout << sz << std::endl;
}

void withArray()
{
    const char sz[] = "hello";
    std::cout << sz << std::endl;
}

(我知道std::string也是一个选项,但我特别想知道char指针/数组)

推荐答案

首先,两者都有明显的不同:

  1. 第一个创建一个指针.
  2. 第二个创建一个array.

请继续阅读以获得更详细的解释:

数组版本:

char text[] = "text"; 

创建一个足以容纳字符串文字"text"的数组,包括它的NULL个结束符.数组text用字符串文字"text".The array can be modified at a later time初始化.此外,即使在编译时,数组的大小也是已知的,因此102 operator can be used to determine its size.


指针版本:

char *text  = "text"; 

创建指向字符串文字"文本"的指针.这比数组版本but string pointed by the pointer should not be changed快,因为它位于只读实现定义的内存中.修改这样的字符串文字将导致Undefined Behavior.

事实上,C++03不赞成使用不带const关键字的字符串文字.因此,宣言应该是:

const char*text = "text";

另外,因为sizeof运算符只会给出指针变量的大小,所以您需要need to use the 100 function, and not 101 to find size of the string.


哪个版本更好?

取决于用法.

  • 如果不需要对字符串进行任何更改,请使用指针版本.
  • 如果要更改数据,请使用数组版本.

编辑:我刚刚注意到(在 comments 中)OP寻求以下各项之间的区别:

const char text[]const char* text

除了关于修改字符串文字的那一点外,上述不同点仍然适用.对于const限定符,数组test现在是一个包含const char类型元素的数组,这意味着它们不能被修改.

考虑到这一点,我会 Select 数组版本而不是指针版本,因为指针可以(错误地)轻松地重新定位到另一个指针,并且可以通过另一个指针修改字符串,从而生成一个UB.

C++相关问答推荐

C:gcc返回多个错误定义,但msvc—不""'

增加getaddrinfo返回的IP地址数量

如何一次获取一个字符

在一个小型玩具项目中实现终端历史记录功能

在Rust和C之间使用ffi时如何通过 struct 中的[U8;1]成员传递指针

用C++实现余弦函数

为什么指针运算会产生错误的结果?

GTK函数调用将完全不相关的char* 值搞乱

S在本文中的价值观到底出了什么问题?

正数之和是负数

循环中的静态变量与块中的变量和循环

如何将大写/小写土耳其字母相互转换?

如何读取程序中嵌入的数据S自己的ELF?

为什么我的二叉树删除删除整个左部分的树?

如何在C宏定义中包含双引号?

try 查找带有指针的数组的最小值和最大值

C程序printf在getchar while循环后不工作

我正在使用 klib 库 我可以使用 (khash) KHASH_SET_INIT_INT64() 负值作为键.因为我在头文件中看到它使用 unsigned long int

GDB 跳过动态加载器代码

在 C/C++ 中原子按位与字节的最佳方法?