gpt4 book ai didi

c - 哪个效率更高 : char str[] or char *str?

转载 作者:行者123 更新时间:2023-11-30 20:49:25 25 4
gpt4 key购买 nike

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

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

最佳答案

他们做两件不同的事情。

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; 则指向任何内容;.

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

const char *const str2 = "World";

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

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

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

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

关于c - 哪个效率更高 : char str[] or char *str?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16256805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com