字符数组和字符串常量

news2024/11/5 16:31:24

11、写出下面的结果
char str1[] = “abc”;
char str2[] = “abc”;
const char str3[] = “abc”;
const char str4[] = “abc”;
const char *str5 = “abc”;
const char *str6 = “abc”;
char *str7 = “abc”;
char *str8 = “abc”;
cout << ( str1 == str2 ) << endl;
cout << ( str3 == str4 ) << endl;
cout << ( str5 == str6 ) << endl;
cout << ( str7 == str8 ) << endl;
结果是:0 0 1 1
解答:str1,str2,str3,str4 是数组变量,它们有各自的内存空间;
而str5,str6,str7,str8 是指针,它们指向相同的常量区域。

在你提供的代码片段中,涉及到字符串数组和字符串指针的比较。在 C++ 中,使用 == 运算符比较字符串(或字符数组)时,实际上比较的是指针的地址,而不是字符串的内容。这是导致结果不同的关键。

代码分析

#include <iostream>
using namespace std;

int main() {
    char str1[] = "abc";           // 字符数组,存储在不同的内存地址
    char str2[] = "abc";           // 字符数组,存储在不同的内存地址
    const char str3[] = "abc";     // 常量字符数组,存储在不同的内存地址
    const char str4[] = "abc";     // 常量字符数组,存储在不同的内存地址
    const char *str5 = "abc";      // 指向字符串常量的指针
    const char *str6 = "abc";      // 指向字符串常量的指针
    char *str7 = "abc";            // 指向字符串常量的指针(不推荐,因字符串常量是只读的)
    char *str8 = "abc";            // 指向字符串常量的指针(同上)

    cout << (str1 == str2) << endl; // 0
    cout << (str3 == str4) << endl; // 0
    cout << (str5 == str6) << endl; // 1
    cout << (str7 == str8) << endl; // 1

    return 0;
}

逐行分析

  1. str1 == str2

    • str1str2 都是字符数组,存储在不同的内存地址上。因此,比较它们的地址会返回 false,即 0
  2. str3 == str4

    • str3str4 也是字符数组,同样存储在不同的内存地址上,因此比较它们的地址也返回 false,即 0
  3. str5 == str6

    • str5str6 是指向字符串常量的指针。在某些编译器或优化情况下,字符串常量 "abc" 可能会存储在同一内存地址(常量池中)。因此,它们指向同一个内存地址,比较返回 true,即 1
  4. str7 == str8

    • str7str8 也是指向字符串常量的指针。由于它们都指向相同的字符串常量 "abc",因此同样返回 true,即 1

总结

  • 数组 vs. 指针:在 C/C++ 中,字符数组是不同的对象,比较时会比较它们的地址;而指向常量字符串的指针如果指向同一个字符串常量,则它们的地址是相同的。
  • 输出结果
    • 0 (对于 str1 == str2)
    • 0 (对于 str3 == str4)
    • 1 (对于 str5 == str6)
    • 1 (对于 str7 == str8)

因此,最终的输出是:

0
0
1
1

注意事项

  • 使用 char * 指向字符串常量是危险的,因为字符串常量通常是只读的,修改它们可能导致未定义的行为。建议使用 const char * 来指向字符串常量。

字符数组和字符串常量在 C/C++ 中有明显的区别,这些区别涉及到内存分配、可修改性以及使用方式。下面是它们的详细对比和区分方法。

1. 定义和内存分配

  • 字符数组

    • 使用数组定义,可以直接修改其内容。
    • 在栈上分配内存,内存是可写的。
    • 示例:
      char str1[] = "abc";  // 创建一个字符数组,内容是 'a', 'b', 'c', '\0'
      
  • 字符串常量

    • 通常是使用字符串字面值(如 "abc")创建的,存储在只读区域(常量区)。
    • 不能修改其内容,尝试修改会导致未定义行为。
    • 示例:
      const char *str2 = "abc"; // str2 是指向字符串常量的指针
      

2. 可修改性

  • 字符数组

    • 可以直接修改数组中的字符。例如:
      char str1[] = "abc";
      str1[0] = 'A'; // 合法,str1 变为 "Abc"
      
  • 字符串常量

    • 不可以修改,尝试修改会导致运行时错误:
      const char *str2 = "abc";
      // str2[0] = 'A'; // 错误,未定义行为
      

3. 内存地址

  • 字符数组

    • 每个字符数组在栈上有自己的内存地址。
    • 即使内容相同,它们的地址也不同。
    • 示例:
      char str1[] = "abc";
      char str2[] = "abc";
      cout << &str1 << endl; // 地址不同
      cout << &str2 << endl; // 地址不同
      
  • 字符串常量

    • 同样的字符串常量在程序中可能只占用一个内存地址,多个指针可能指向同一个字符串常量。
    • 示例:
      const char *str3 = "abc";
      const char *str4 = "abc";
      cout << (str3 == str4) << endl; // 可能输出 1,表示地址相同
      

4. 使用场景

  • 字符数组

    • 当需要修改字符串内容时,使用字符数组。
    • 适合在需要动态修改字符的场合。
  • 字符串常量

    • 当只需要读取字符串,且不需要修改时,使用字符串常量。
    • 常用于定义常量字符串和在函数中传递字符串参数。

总结

  • 字符数组是一个可修改的、存储在可写内存的数组,而字符串常量是不可修改的、存储在只读内存的常量。选择使用哪种取决于你对字符串的操作需求。理解这两者之间的区别能够帮助避免内存错误和程序崩溃。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2231746.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

物流公司出货单据模板下载软件 佳易王物流单管理系统操作使用教程

一、概述 【软件资源文件下载可以点文章最后信息卡片】 物流公司出货单据模板下载软件物流单管理系统操作使用教程 ‌软件功能‌&#xff1a; ‌记录管理‌&#xff1a;记录运费、垫付货款、代收货款、保险费等。‌打印模式‌&#xff1a;支持空白单、卷纸、印刷好的单子等多…

谷粒商城のsentinelzipkin

文章目录 前言一、Sentinel1、什么是Sentinel2、项目配置3、使用案例3.1、流控3.2、降级3.3、黑白名单设置 二、Zipkin1、什么是Zipkin2、项目配置3、整合案例 前言 本篇介绍Spring Cloud Ali的sentinel组件&#xff0c;用于对微服务的熔断降级&#xff0c;以及链路追踪zipkin的…

WPF+MVVM案例实战(十九)- 自定义字体图标按钮的封装与实现(EF类)

文章目录 1、案例效果1、按钮分类2、E类按钮功能实现与封装1.文件创建与代码实现2、样式引用与封装 3、F类按钮功能实现与封装1、文件创建与代码实现2、样式引用与封装 3、按钮案例演示1、页面实现与文件创建2、运行效果如下 4、源代码获取 1、案例效果 1、按钮分类 在WPF开发…

keepalived + nginx 实现网站高可用性(HA)

keepalive 一、keepalive简介二、实现步骤1. 环境准备2. 安装 Keepalived3. 配置 Keepalived 双机主备集群架构4. 配置 Nginx5. 启动Keepalived6. 测试高可用性7. 配置keepalived 双主热备集群架构 一、keepalive简介 目前互联网主流的实现WEB网站及数据库服务高可用软件包括&a…

破局智能制造:难点分析与对策

一、 智能制造过程中可能遇到难点: 1. --概念和技术繁多--: - 智能制造领域涉及众多概念和技术,如工业4.0、CPS、工业互联网等,让企业难以选择和应用。 2. --缺乏经验和成功案例--: - 企业在推进智能制造时缺乏经验,存在信息孤岛、自动化孤岛等问题,缺乏统一规划和系统推…

中汽测评观察 亲子出行健康为先,汽车健康用材成重要考量

在中国&#xff0c;亲子出行是驾车的主要场景之一。汽车不仅仅是一种便捷的交通工具&#xff0c;更是生活中的移动“第三空间”。在此背景下&#xff0c;汽车健康用材不仅是消费者关注的焦点问题&#xff0c;也成为汽车企业发力的重要方向。 对消费者而言&#xff0c;在家庭亲子…

阿里巴巴Seata分布式事务解决方案

Seata是什么 Seata是一款开源的分布式事务解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 当开发框架为spring boot或者SSM&#xff0c;都可以使用Seata进行开发。 分布式事务是什么 在大型架构中&#xff0c;一般会把一个应用系统&#x…

Cuebric:用AI重新定义3D创作的未来

一、简介 Cuebric 是一家成立于2022年夏天的好莱坞创新公司,致力于为电影、电视、游戏和时尚等行业提供先进的AI多模态SaaS平台。自2024年1月正式推出以来,Cuebric 已经在市场上获得了广泛的认可和积极的反馈。目前,该平台正处于1.0版本的beta测试阶段,已募集约50万美元的…

【Spring IoCDI】IoC容器,IoC注解,Bean的使用

【Spring核心思想:IoC】 spring是一个开源框架&#xff0c;支持广泛的应用场景&#xff0c;简而言之:Spring是包含了众多工具方法的IoC容器 【IoC】 IoC的意思是「控制反转」&#xff0c;也就是说Spring是一个“控制反转”的容器 通用程序的实现代码&#xff0c;类的创建顺序…

Android笔记(三十一):Deeplink失效问题

背景 通过deeplink启动应用之后&#xff0c;没关闭应用的情况下&#xff0c;再次使用deeplink会失效的问题&#xff0c;是系统bug导致的。此bug仅在某些设备&#xff08;Nexus 5X&#xff09;上重现&#xff0c;launchMode并且仅当应用程序最初通过深层链接启动并再次通过深层…

深入理解Transformer中的位置编码

1 位置编码的作用 由于注意力的作用机制&#xff0c;不论输入序列的顺序如何&#xff0c;输出结果都是一样的。 也就是丢失了位置信息。 但是对于语言模型&#xff0c; 我们都知道顺序是很重要的&#xff0c; 所以需要对输入序列额外注入位置信息。 2 位置编码方式 Transfor…

Ansible 部署应用

Ansible Ansible 是基于 Python 开发&#xff0c;集合了众多优秀运维工具的优点&#xff0c;实现了批量运行命令、部署程序、配置系统等功能的自动化运维管理工具。默认通过 SSH 协议进行远程命令执行或下发配置&#xff0c;无需部署任何客户端代理软件&#xff0c;从而使得自动…

根据问题现象、用户操作场景及日志打印去排查C++软件问题,必要时尝试去复现问题

目录 1、概述 2、通过现有信息无法定位问题时&#xff0c;则需要尝试去复现问题 3、非崩溃问题与崩溃问题的一般排查思路 3.1、非崩溃问题的排查思路 3.2、崩溃问题的排查思路 4、难以复现问题的可能原因总结 4.1、问题难以复现&#xff0c;可能和某种特殊的业务场景或操…

STL——string(2)

博客ID&#xff1a;LanFuRenC系列专栏&#xff1a;C语言重点部分 C语言注意点 C基础 Linux 数据结构 C注意点 今日好题 声明等级&#xff1a;黑色->蓝色->红色 欢迎新粉加入&#xff0c;会一直努力提供更优质的编程博客&#xff0c;希望大家三连支持一下啦 目录 1) …

Spark的集群环境部署

一、Standalone集群 1.1、架构 架构&#xff1a;普通分布式主从架构 主&#xff1a;Master&#xff1a;管理节点&#xff1a;管理从节点、接客、资源管理和任务 调度&#xff0c;等同于YARN中的ResourceManager 从&#xff1a;Worker&#xff1a;计算节点&#xff1a;负责利…

【大数据学习 | kafka】kafka的数据存储结构

以上是kafka的数据的存储方式。 这些数据可以在服务器集群上对应的文件夹中查看到。 [hexuanhadoop106 __consumer_offsets-0]$ ll 总用量 8 -rw-rw-r--. 1 hexuan hexuan 10485760 10月 28 22:21 00000000000000000000.index -rw-rw-r--. 1 hexuan hexuan 0 10月 28 …

【Leecode】Leecode刷题之路第40天之组合总和II

题目出处 40-组合总和II-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 40-组合总和II-官方解法 方法1&#xff1a;回溯 思路&#xff1a; 代码示例&#xff1a;&#xff08;Java&…

网络编程入门——网络原理初识

一、网络发展史 1.1 独立模式 即计算机之间相互独立&#xff0c;互不连通的。 1.2 网络互联 即将多台计算机连接在一起&#xff0c;完成数据共享。 数据共享本质是⽹络数据传输&#xff0c;即计算机之间通过⽹络来传输数据&#xff0c;也称为⽹络通信。 根据网络互联规模的不…

关于爬虫需要了解的基础知识 (一、 http协议)

声明 文章仅供学习与交流&#xff01;严禁用于任何商业与非法用途&#xff01;否则由此产生的一切后果均与作者无关&#xff01; 一、何为爬虫 爬虫&#xff08;Crawler&#xff09;是一种按照既定规则&#xff0c;在网络上自动爬取信息的程序或脚本&#xff0c;也称为网际网…

VidPanos:从随手拍摄的平移视频生成全景视频

在当今数字化时代,视频拍摄已经成为人们记录生活和分享经历的重要方式。然而,普通手机拍摄的视频往往受到视角的限制,无法完整地展现一个广阔的场景。今天,我们要介绍的 VidPanos 技术,为解决这个问题提供了一种创新的方法。 VidPanos 是由来自华盛顿大学、谷歌 DeepMind…