【问题标题】:Which is more efficient: char str[] or char *str? [closed]哪个更有效:char str[] 还是 char *str? [关闭]
【发布时间】:2013-04-27 20:57:40
【问题描述】:

为了提高效率,有没有理由使用其中一个而不是另一个?

char str1[] = "Hello"
char *str2  = "World"

【问题讨论】:

  • 对于可重复使用的 str1[] 更好。
  • 效率怎么样? (我编辑了这个问题,只关注效率)
  • 它们的用途不同,因此无法比较。一个给你一个指向不可修改文字的指针。另一个创建具有可修改内容的 C 字符串变量。这个问题是不合逻辑的。
  • @David 没有说指针必须是不可变的,事实上,大多数编译器都支持以这种方式使用可变文字。这只是未定义的行为。
  • @RichardJ.RossIII 我不是这么说的。我说“指向不可修改文字的指针”。字符串文字是不可修改的。

标签: c arrays string pointers char


【解决方案1】:

他们做两种不同的事情。

char str1[] = "Hello";

等价于

char str1[6] = "Hello";

它使str1 成为6 个chars 的数组,初始化为"Hello" 加上一个'\0' 终止符。

这个:

char *str2  = "World";

使str2成为指向char的指针,指向静态分配的6个chars只读数组的第一个元素,该数组初始化为"World"加上一个'\0'终结者。

我提到该数组是只读的——但由于历史原因,它实际上并不是const;试图改变它有未定义的行为。您应该将其定义为const,以便在您错误地尝试修改它时编译器会警告您:

const char *str2 = "World";

str1 和 str2 在某些(但不是全部)上下文中可以互换使用。例如,puts(str1) 或puts(str2) 都会将相应的字符串打印到标准输出(后跟换行符)。这是因为在大多数情况下,数组名称“衰减”为指向数组第一个元素的指针。

由于str1是一个数组,你可以对它应用sizeof来确定数组有多大; sizeof str2 为您提供 char* 指针的大小,这可能没有用处。

使用第一个声明,你可以修改数组的字符,但你不能改变它的大小,你不能让str1指向不同的数组。

使用第二个声明,您无法修改数组的字符,但您可以更改指针值本身,使其指向其他数组,或者如果您执行str2 = NULL;,则不指向任何内容。

如果您只想使用str1 或str2 将其传递给期望char* 指向字符串的对象,则可以使用任何一种形式。指针形式更清楚地表明您不会修改字符串。你甚至可以写:

const char *const str2 = "World";

如果你想防止修改字符串或指针。

如果您想做其他事情,一种或另一种形式可能有一些优势,但在不知道您在使用它的情况下,我无法进一步评论。

效率上应该没有任何显着差异。首先专注于您希望代码的行为方式。将const 添加到您不打算修改的任何内容有助于记录您的意图,并可能帮助编译器生成更好的代码(因为它不需要假设某些内容可能已被修改)。

推荐阅读:comp.lang.c FAQ,尤其是第 6 节,它涵盖了数组和指针。

【讨论】:

  • 谢谢。完美回答我的问题。我正在尝试将字符串传递给可能会更改字符串内容的多个函数。大小可以保持不变,没关系。
  • 在这种情况下效率无关紧要。如果你需要修改字符串,那么你不能使用文字。
猜你喜欢
  • 1970-01-01
  • 2022-06-15
  • 2011-04-21
  • 2015-08-13
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
相关资源
最近更新 更多