热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Whichismoreefficient:charstr[]orchar*str?

Thisarticlediscussestheefficiencyofusingcharstr[]andchar*strandwhetherthereisanyreasontopreferoneovertheother.Itexplainsthedifferencebetweenthetwoandprovidesanexampletoillustratetheirusage.

For the sake of efficiency, is there ever a reason to use one of these over the other?

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

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

1 个解决方案

#1


4  

They do two different things.

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

char str1[] = "Hello";

is equivalent to

相当于

char str1[6] = "Hello";

It makes str1 an array of 6 chars, initialized to "Hello" plus a '\0' terminator.

它使str1成为一个包含6个字符的数组,初始化为“Hello”加上一个'\ 0'终止符。

This:

char *str2  = "World";

makes str2 a pointer to char, pointing to the first element of a statically allocated read-only array of 6 chars, which is initialized to "World" plus a '\0' terminator.

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

I mentioned that the array is read-only -- but for historical reasons it's not actually const; attempting to change it has undefined behavior. You should define it as const so the compiler will warn you if you incorrectly attempt to modify it:

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

const char *str2 = "World";

str1 and str2 can be used interchangeably in some, but not all, contexts. For example, either puts(str1) or puts(str2) will print the corresponding string to standard output (followed by a newline). This is because an array name, in most contexts, "decays" to a pointer to the array's first element.

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

Since str1 is an array, you can apply sizeof to it to determine how big the array is; sizeof str2 gives you the size of a char* pointer, which probably won't be useful.

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

With the first declaration, you can modify the characters of the array, but you can't change its size, and you can't make str1 refer to a different array.

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

With the second declaration, you can't modify the characters of the array, but you can change the pointer value itself so it points to some other array, or to nothing if you do str2 = NULL;.

使用第二个声明,您不能修改数组的字符,但您可以更改指针值本身,使其指向其他数组,如果您执行str2 = NULL,则不会改为任何内容。

If all you want to do with str1 or str2 is pass it to something that expects a char* that points to a string, you can use either form. The pointer form makes it a bit clearer that you're not going to be modifying the string. You can even write:

如果你想用str1或str2做的只是将它传递给需要指向字符串的char *的东西,你可以使用任何一种形式。指针形式使您更加清楚,您不会修改字符串。你甚至可以写:

const char *const str2 = "World";

if you want to prevent modifying either the string or the pointer.

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

If you want to do something else, one form or the other may have some advantages, but I can't comment further without knowing what you're using it for.

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

There shouldn't be any significant difference in efficiency. Concentrate first on what how you want your code to behave. Adding const to anything you don't intend to modify helps document your intent and may help the compiler generate better code (because it doesn't need to assume that something may have been modified).

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

Recommended reading: the comp.lang.c FAQ, particularly section 6 which covers arrays and pointers.

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


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • C++构造函数与初始化列表详解
    本文深入探讨了C++中构造函数的初始化列表,包括赋值与初始化的区别、初始化列表的使用规则、静态成员初始化等内容。通过实例和调试证明,详细解释了初始化列表在对象创建时的重要性。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
author-avatar
M7y4C8r2a6z4y
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有