热门标签 | 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节,其中包括数组和指针。


推荐阅读
  • 使用JS、HTML5和C3创建自定义弹出窗口
    本文介绍如何结合JavaScript、HTML5和C3.js来实现一个功能丰富的自定义弹出窗口。通过具体的代码示例,详细讲解了实现过程中的关键步骤和技术要点。 ... [详细]
  • 本文介绍 SQL Server 的基本概念和操作,涵盖系统数据库、常用数据类型、表的创建及增删改查等基础操作。通过实例帮助读者快速上手 SQL Server 数据库管理。 ... [详细]
  • 本题探讨了在一个有向图中,如何根据特定规则将城市划分为若干个区域,使得每个区域内的城市之间能够相互到达,并且划分的区域数量最少。题目提供了时间限制和内存限制,要求在给定的城市和道路信息下,计算出最少需要划分的区域数量。 ... [详细]
  • 深入解析ESFramework中的AgileTcp组件
    本文详细介绍了ESFramework框架中AgileTcp组件的设计与实现。AgileTcp是ESFramework提供的ITcp接口的高效实现,旨在优化TCP通信的性能和结构清晰度。 ... [详细]
  • 在编译BSP包过程中,遇到了一个与 'gets' 函数相关的编译错误。该问题通常发生在较新的编译环境中,由于 'gets' 函数已被弃用并视为安全漏洞。本文将详细介绍如何通过修改源代码和配置文件来解决这一问题。 ... [详细]
  • 本文详细介绍了虚拟专用网(Virtual Private Network, VPN)的概念及其通过公共网络(如互联网)构建临时且安全连接的技术特点。文章探讨了不同类型的隧道协议,包括第二层和第三层隧道协议,并提供了针对IPSec、GRE以及MPLS VPN的具体配置指导。 ... [详细]
  • 本文深入探讨了 Delphi 中类对象成员的核心概念,包括 System 单元的基础知识、TObject 类的定义及其方法、TClass 的作用以及对象的消息处理机制。文章不仅解释了这些概念的基本原理,还提供了丰富的补充和专业解答,帮助读者全面理解 Delphi 的面向对象编程。 ... [详细]
  • [Vue.js 3.0] Guide – Scaling Up – State Management
    [Vue.js 3.0] Guide – Scaling Up – State Management ... [详细]
  • 编程挑战:2019 Nitacm 校赛 D 题 - 雷顿女士与分队(高级版)
    本文深入解析了2019年Nitacm校赛D题——雷顿女士与分队(高级版),详细介绍了问题背景、解题思路及优化方案。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • C语言基础入门:7个经典小程序助你快速掌握编程技巧
    本文精选了7个经典的C语言小程序,旨在帮助初学者快速掌握编程基础。通过这些程序的实践,你将更深入地理解C语言的核心概念和语法结构。 ... [详细]
  • 本文介绍了多个适用于用户界面设计的Canvas框架,帮助开发者选择最适合的工具。 ... [详细]
  • 本文将详细探讨Linux pinctrl子系统的各个关键数据结构,帮助读者深入了解其内部机制。通过分析这些数据结构及其相互关系,我们将进一步理解pinctrl子系统的工作原理和设计思路。 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • 深入理解路由器控制平面与转发平面及路由表
    本文详细介绍了路由器的控制平面和转发平面,并解释了路由表及其核心表项的重要性,帮助读者全面掌握路由器的工作原理。 ... [详细]
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社区 版权所有