为了提高效率,有没有理由使用其中一个而不是另一个?
char str1[] = "Hello"
char *str2 = "World"
他们做两种不同的事情。
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;
。
如果您只想使用str1
或str2
将其传递给期望 achar*
指向字符串的东西,则可以使用任何一种形式。指针形式更清楚地表明您不会修改字符串。你甚至可以写:
const char *const str2 = "World";
如果您想防止修改字符串或指针。
如果您想做其他事情,一种或另一种形式可能有一些优势,但我无法在不知道您使用它的情况下进一步评论。
在效率上应该没有任何显着差异。首先专注于您希望代码的行为方式。添加const
到您不打算修改的任何内容有助于记录您的意图,并可能帮助编译器生成更好的代码(因为它不需要假设某些内容可能已被修改)。
推荐阅读:comp.lang.c FAQ,特别是第 6 节,它涵盖了数组和指针。