-3

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

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

1 回答 1

4

他们做两种不同的事情。

char str1[] = "Hello";

相当于

char str1[6] = "Hello";

它创建str1了一个 6 s 的数组char,初始化为"Hello"加上一个'\0'终止符。

这个:

char *str2  = "World";

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

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

const char *str2 = "World";

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

既然str1是一个数组,你可以应用sizeof它来判断这个数组有多大;sizeof str2给你一个char*指针的大小,这可能没有用。

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

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

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

const char *const str2 = "World";

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

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

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

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

于 2013-04-27T21:11:11.807 回答