哪个更有效:char str []或char * str?

时间:2013-04-27 20:57:41

标签: c arrays string pointers char

为了提高效率,是否有理由将其中一种用于另一种?

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

1 个答案:

答案 0 :(得分:4)

他们做了两件不同的事情。

char str1[] = "Hello";

相当于

char str1[6] = "Hello";

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

此:

char *str2  = "World";

使str2 指针指向char,指向静态分配的6 char s只读数组的第一个元素,该数组已初始化到"World"'\0'终结符。

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

const char *str2 = "World";

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

由于str1是一个数组,您可以对其应用sizeof以确定数组的大小; sizeof str2为您提供char*指针的大小,这可能不会有用。

使用第一个声明,您可以修改数组的字符,但是您无法更改其大小,并且您无法使str1引用不同的数组。

使用第二个声明,您无法修改数组的字符,但您可以更改指针值本身,使其指向其他数组,如果执行str2 = NULL;,则无需更改。< / p>

如果要对str1str2所做的只是将其传递给期望char*指向字符串的内容,则可以使用任一形式。指针形式使您更加清楚,您将不会修改字符串。你甚至可以写:

const char *const str2 = "World";

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

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

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

推荐阅读:comp.lang.c FAQ,特别是第6节,其中包含数组和指针。

相关问题