基于字符数组s[]的s,s

news/2024/11/17 0:56:20/文章来源:https://www.cnblogs.com/hisun9/p/18550178

看这样一段代码:

#include <iostream>
using namespace std;int main()
{const char s[] = "hello";cout << "Array content (s): " << s << endl;       // 输出字符串内容cout << "Address of s (&s): " << &s << endl;     // 输出整个数组的地址cout << "Address of s[0] (s): " << (void*)s << endl; // 强制转换输出地址
}

输出如下:

img

输出结果解释

  • Array content (s): hello

    s 被解释为字符串的首地址,因此输出字符串内容。

  • Address of s (&s): 0x70fe10

    &s 是整个数组的地址,和数组首地址一致,但类型不同。

  • Address of s[0] (s): 0x70fe10

    s 被转换为 void*,明确输出其地址。

着重解释下为什么s 被解释为字符串的首地址,因此输出字符串内容

详细原因与机制

  1. 数组名的退化

    • 在 C 和 C++ 中,当数组名 s 在需要指针的上下文中使用时,它会退化为一个指向数组首元素的指针(即 &s[0])。这种退化适用于大多数场景,例如传参或与指针运算。

    • 但注意,此时数组名 s 并不是一个指针,它是一个常量,表示数组首元素的地址。

  2. cout 的行为

    • cout 是一个流输出对象,它对不同类型的输入进行了重载:

    • 如果输入的是指向 char 的指针(即 const char*char*),cout 会将其解释为一个 C 风格字符串,并输出字符串内容。

    • 如果输入的是其他类型的指针,例如 void*int*,cout 会输出这个指针的地址。

    在该代码中,s 退化为 const char*,因此 cout 将其解释为 C 风格字符串并输出 "hello"。

  3. 字符串的存储

const char s[] = "hello"; 实际上在内存中分配了一个 6 字节的数组:

地址       内容
0x70fe10   'h'
0x70fe11   'e'
0x70fe12   'l'
0x70fe13   'l'
0x70fe14   'o'
0x70fe15   '\0'

当 s 被用作 cout 的参数时,s 退化为 &s[0](即 0x70fe10),因此 cout 会从该地址开始,逐字节读取字符并输出,直到遇到字符串的终止符 \0。

着重解释下s和&s

  1. s 是什么?

    • s 是一个字符数组,const char s[] = "hello"; 定义了一个大小为 6(包括字符串末尾的空字符 \0)的数组。

    • s 的类型是 const char[6]。

  2. &s 是什么?

    • &s 是整个数组 s 的地址,而不是数组的第一个元素的地址(s 和 &s 在语义上不同)。

    • s 表示数组首元素(s[0])的地址,类型是 const char*

    • &s 表示整个数组的地址,类型是 const char (*)[6]

  3. cout 如何处理 &s?

    • 在 cout 中,标准输出流没有重载对 const char (*)[N] 类型的直接处理。

    • 当传递 &s 时,它会退化为一个指向数组的指针。

    • 通常,C++ 的 cout 会将指针解释为地址,并输出地址值(例如 0x70fe10)。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE5 打包安卓后出现permission required you must approve this premission in app settings: storage弹窗

论坛里面有人给出了利用UPL解决的方法但不会UPL,没有使用这个方法,而是参考了这篇知乎文章 其实都提到了在项目文件\Intermediate\Android\arm64_AndroidManifest.xml这个文件中的修改, 而在一开始的这个弹窗是其中的这条语句<meta-data android:name="com.epicgame…

20222405 2024-2025-1 《网络与系统攻防技术》实验六实验报告

1.实验内容 经过高强度的攻击渗透操作,我现在已经熟练的掌握了Metasploit工具的用法,也深刻体会到漏洞的可怕之处,这些漏洞会严重威胁到我们的隐私安全。 2.实验过程 (1)前期渗透 ①主机发现 输入命令msfconsole进入控制台 再search arp_sweep搜索一下成功找到 输入use 0使…

第五章

5.1 节练习 练习 5.1 空语句是最简单的语句,空语句由一个单独的分号构成。如果在程序的某个地方,语法上需要一条语句但是逻辑上不需要,此时应该使用空语句,空语句什么也不做。 一种常见的情况是,当循环的全部工作在条件部分就可以完成时,我们通常会用到空语句。使用空语句…

AI独立开发完全指南:从Cursor到变现的实战攻略

大家好,我是加加,今天给大家分享的是用 cursor 实现复杂创意想法。近期参加了圈子里的 cursor 培训,当了回教练,以下是我分享的那节课的主要内容,分享给初学者想要入门AI独立开发的朋友。这几乎就是逐字稿了,但是生生的让我给读成了磕磕绊绊,我这口头表达能力啊,真是太…

OCS助手配置

使用准备:装有Edge浏览器的电脑鼠标眼睛一双灵活的手一颗勇敢不放弃的心♥安装流程 1.安装油猴插件 2.安装油猴脚本-OCS助手 3.配置OCS助手 4.启动刷课 教程开始 1.安装油猴插件打开Edge浏览器的主页2.点击三个点点点击扩展3.点击"打开MIcrosoft Edge加载项"4.在左边…

测试笔记1

测试笔记1 ​​

Win11安装kali子系统

Win11安装kali子系统 1. 开启服务,更新wsl2 启用或关闭Windows功能 -> 开启适用于Linux的Windows子系统wsl --update #更新到wsl2`wsl --status #检查一下`2. 安装kali,换源配置工具 wsl --install kali-linux #安装kali-linux`换源中科大源,会变快很多,将官方源…

002.测试2

002.测试2 ​​ ‍

第三篇:Scrum冲刺博客

冲刺博客:Day 3 - 数据处理与设计细化 站立式会议照片: ![站立式会议 - Day 3](链接到Day 3的照片) 工作进展:许莹柔(机器学习工程师):昨日完成:数据集预处理工作开始。 今日计划:继续数据集预处理,并开始模型训练。 遇到的困难:数据集存在一些异常值需要处理。肖晓霞…