为了提高效率,是否有理由将其中一种用于另一种?
char str1[] = "Hello"
char *str2 = "World"
答案 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";
str1
和str2
可以在某些(但不是全部)上下文中互换使用。例如,puts(str1)
或puts(str2)
会将相应的字符串打印到标准输出(后跟换行符)。这是因为在大多数情况下,数组名称会衰减"到指向数组的第一个元素的指针。
由于str1
是一个数组,您可以对其应用sizeof
以确定数组的大小; sizeof str2
为您提供char*
指针的大小,这可能不会有用。
使用第一个声明,您可以修改数组的字符,但是您无法更改其大小,并且您无法使str1
引用不同的数组。
使用第二个声明,您无法修改数组的字符,但您可以更改指针值本身,使其指向其他数组,如果执行str2 = NULL;
,则无需更改。< / p>
如果要对str1
或str2
所做的只是将其传递给期望char*
指向字符串的内容,则可以使用任一形式。指针形式使您更加清楚,您将不会修改字符串。你甚至可以写:
const char *const str2 = "World";
如果你想阻止修改字符串或指针。
如果你想做别的事情,一种形式或另一种形式可能有一些优势,但我不能在不知道你使用它的情况下进一步评论。
效率不应该有任何显着差异。首先集中于您希望代码的行为方式。将const
添加到您不打算修改的任何内容中有助于记录您的意图,并可能有助于编译器生成更好的代码(因为它不需要假设某些内容可能已被修改)。
推荐阅读:comp.lang.c FAQ,特别是第6节,其中包含数组和指针。