C++ 之指针

2023-11-10

参考

项目 描述
精通C++ (第九版) 托尼·加迪斯、朱迪·沃尔特斯、戈德弗雷·穆甘达 (著) / 黄刚 等 (译)
搜索引擎 Bing

描述

项目 描述
操作系统 Windows 10 专业版(64 位)
C++ 编译器 gcc version 8.1.0 (x86_64-win32-seh-rev0, Built by MinGW-W64 project)

指针

指针中存放着指向内存中的某一空间(空间大小为一个字节,内存以字节为基础进行地址的编排及内存的划分)的内存地址,CPU 可以通过这个地址以及一些其它信息获取到该内存地址对应的内存空间中存放的数据。

内存的每一个字节都有唯一的地址。变量的地址是分配给该变量的第一个字节的地址。

运算符

地址运算符

使用地址运算符 & 你将获得 C++ 分配给一个变量或常量(使用 const 等关键字定义的常量)的内存空间的第一个字节所对应的内存地址。你仅需将地址运算符放置在变量或常量的标识符前可取得该变量或常量所对应的地址。对此,请参考如下示例:

// 导入 iostream 以实现基本的输入输出
#include <iostream>
// 导入 string 以使用 String 类创建字符串
#include <string>
// 使用 C++ 标准命名空间
using namespace std;


int main(){
    // 声明一些常量及变量
    int a;
    const int b = 1;
    char c = 'c';
    string d = "Hello World";
    
    // 输出被声明的变量或常量所处的内存空间
    // 所对应的地址。
    cout << &a << endl;
    cout << &b << endl;
    cout << &c << endl;
    cout << &d << endl;

    // 暂停控制台的继续运行,便于观察输出到控制台中的内容。
    system("pause");
}

执行效果

0x61fe08
0x61fe04
c
0x61fde0
请按任意键继续. . .

注:

  1. 内存地址前的 0x 表明该内存地址是以十六进制的格式进行显示的。
  2. 在默认情况下,通过 & 运算符向控制台输出的内容为十六进制格式的内存地址。相比于十六进制的格式的内存地址,你可能更愿意观察十进制格式的内存地址。为此,你可以通过在 &标识符 前添加 (long long) (使用 (long long) 是由于我的操作系统是 64 位 的,使用 8 个字节来实现地址。如果你的操作系统是 32 位 的操作系统,那么你还能够使用 (int) 来转换数值所使用的进制格式。)来将十六进制格式的内存地址转换为十进制格式的内存地址。对此,请参考如下示例:
#include <iostream>
#include <string>
using namespace std;


int main(){
    int a;
    const int b = 1;
    char c = 'c';
    string d = "Hello World";
    
    cout << (long long)&a << endl;
    cout << (long long)&b << endl;
    cout << (long long)&c << endl;
    cout << (long long)&d << endl;

    system("pause");
}

执行效果

6422024
6422020
6422019
6421984
请按任意键继续. . .
  1. 你可以通过如下方式来得知计算机的地址使用多少个字节进行表示:
#include <iostream>
#include <string>
using namespace std;


int main(){
    // 此处可以声明任意类型的指针,因为在一台计算机中,
    // 内存地址均使用相同个数的字节进行表示。
    int* a;

    // 通过 sizeof 运算符来获取指针所占用的内存空间
    cout << sizeof a << endl;

    system("pause");
}

执行结果

由于我的计算机支持 64 位 操作系统,而我使用的也是 64 位 的操作系统。因此,内存地址使用八个字节(一个字节包含八位,也即八个比特)进行表示。

8
请按任意键继续. . .
奇偶分体

在使用 C++ 指针时,你可能会发现这么一个现象:若变量或常量存储的数据的数据类型所占用的内存空间不止一个字节,那么该变量或常量的地址多为偶地址。

奇地址与偶地址

  1. 奇地址
    若一个内存地址属于奇数,那么该地址将被认为是一个奇地址。

  2. 偶地址
    若一个内存地址属于偶数,那么该地址将被认为是一个偶地址。

奇偶分体

为了实现存储器的字节寻址及整字(占用内存空间的大小为两个字节)读写功能,人们将存储器分成容量相等(占据相同的内存空间大小,该空间大小为一个字节)的两类存储体,即奇存储体与偶存储体。
奇存储体所占据的内存空间所对应的地址为奇地址,而偶存储体所占据的内存空间所对应的地址为偶地址。

寻址与整字读取功能

  1. 寻址

存储器能够通过传输过来的内存地址对内存单元进行查找。

  1. 整字读取功能

为了充分利用数据总线的传输能力,CPU 从内存中读取数据将以一个字为单位进行读取。且字的起始内存地址需为偶地址(原因暂不明

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 之指针 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • 如何使用 C# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 按成员序列化

    我已经实现了template
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit

随机推荐

  • 可迭代(iterable)和类数组(array-like)

    可迭代 iterable 和类数组 array like 可迭代 iterable 是实现了 Symbol iterator 方法的对象 可以应用 for of 的对象被称为 可迭代的 类数组 array like 是有索引和 length
  • Redis主从复制的原理

    更多内容 欢迎关注微信公众号 全菜工程师小辉 公众号回复关键词 领取免费学习资料 在Redis集群中 让若干个Redis服务器去复制另一个Redis服务器 我们定义被复制的服务器为主服务器 master 而对主服务器进行复制的服务器则被称为
  • pyautogui库的使用教程(超详细)

    一 前言 PyAutoGUI 让您的 Python 脚本控制鼠标和键盘以自动与其他应用程序交互 官方文档 PyAutoGUI documentation 常用函数列表 函数名 功能 基本 pyautogui size 返回包含分辨率的元组
  • 在编辑操作时,el-select多选下拉组件,选中label标签后,框中无法回显选中的label,,,

    1 问题描述 在编辑操作时 页面的el select多选下拉组件 在选择新的label标签时 change事件和监听数组对象都能确定数据已发生改变 ngmodel绑定就是最新的id集合 但就是框中不显示最新选中的label 而change事
  • 论文导读

    图的最大独立集问题 MIS problem 是图论研究中的一个重要问题 具有广泛的应用 本文介绍了最大独立集求解相关的三篇工作 包括一篇启发式方法和两篇基于学习的方法 希望能让大家对这个问题有所了解 问题定义 一个图G V E 的顶点集子集
  • 放弃手写代码吧!用低代码你能生成各种源码

    很多同学不知道为什么要用Low code做开发 传统IT开发不行么 当然可以 传统IT自研软件开发 通过编程去写代码 还有数据库 API 第三方基础架构等 这个方式很好 但不可避免的会带来开发周期长 难度大 技术人员不易开发维护 因此价格及
  • EDUCODER---WEB__JavaScript学习手册十:正则表达式

    第一关 字符串字面量 请在此处编写代码 Begin var pattern js n End 第二关 字符类 请在此处编写代码 Begin var pattern1 a zA Z 0 9 var pattern2 A 0 9 End 第三关
  • Linux下Python环境安装与部署

    因为我是Python零基础 所以如何部署全靠百度 这边我把我查到的资料和安装使用过程中遇到写下来 如果有写的不对的或者有更好的方式 欢迎评论指出 一 Python环境安装 网上有很多安装教程 可以自行百度安装 我参考的是这个 仅第一步安装p
  • The Lost House【树形DP+期望+构造路径】

    题目链接 POJ 2057 题意 有一棵N的点的树 开始的时候蜗牛在1号结点 它不知道它的家在哪个叶子结点 树上的有些结点有虫虫 虫虫会告诉你 你的家是否在以它所在结点为根的子树上 现在需要你规划走的方案 使得找到哪个叶子结点才是家的所走路
  • python将word表格转写入excel

    Notes 想将一份 word 文件中的几个表格转写入 excel 文件中 后续用 excel 处理 用到 python docx 和 pandas 分别处理 word 和 excel 安装 python docx pip install
  • pytorch中网络loss传播和参数更新理解

    相比于2018年 在ICLR2019提交论文中 提及不同框架的论文数量发生了极大变化 网友发现 提及tensorflow的论文数量从2018年的228篇略微提升到了266篇 keras从42提升到56 但是pytorch的数量从87篇提升到
  • 利用R包ggmap进行空间可视化

    ggmap 是在R环境里调用地图作用可视化的利器 它的语法结构跟ggplot2非常相似 也使R语言的用户可以迅速上手 ggmap 结合 ggplot 可以方便快速绘制基于地图的可视化图表 下面的文章里 我将用两个例子 三藩市的犯罪记录 和
  • require 方法详解

    在 NodeJS 中有一个方法是我们使用频率最高的 那就是 require 方法 NodeJs 遵循 CommonJS 规范 该规范的核心是通过 require来加载其他依赖的模块 几个问题 module exports 或者 export
  • 朴素贝叶斯算法python sklearn实现_朴素贝叶斯算法——实现新闻分类(Sklearn实现)...

    1 朴素贝叶斯实现新闻分类的步骤 1 提供文本文件 即 2 准备数据 将数据集划分为训练集和测试集 使用jieba模块进行分词 词频统计 停用词过滤 文本特征提取 将文本数据向量化 3 分析数据 使用matplotlib模块分析 4 训练算
  • 76. 如何理解 Python 中字符串中的\字符?

    Python字符串中的 字符代表转义字符 路径名中用来连接路径名 编写太长代码手动软换行 转义符 转义符 描述 续行符 在行尾时 反斜杠符号 单引号 双引号 a 响铃 b 退格 Backspace e 转义 000 空 n 换行 v 纵向制
  • border-sizing之border-box、content-box

    border sizing是CSS3的属性之一 其属性值为border box content box 我们正常理解的盒模型其实是border sizing的属性值是content box 即正常盒模型 属性值为border box的盒模型
  • linux IO Block layer 解析

    早期的 Block 框架是单队列 single queue 架构 适用于 硬件单队列 的存储设备 比如机械磁盘 随着存储器件技术的发展 支持 硬件多队列 的存储器件越来越常见 比如 NVMe SSD 传统的单队列架构也因此被改成了多队列 m
  • IDEA插件开发

    文章目录 写在前面 1 使用IDEA新建插件项目 1 1 配置SDK并新建项目 非gradle项目 1 2 项目目录结构 1 3 plugin xml 1 4 AnAction 1 5 测试运行 1 6 打包 安装插件 2 AnAction
  • 前缀和【一维前缀和与二维前缀和】

    全文目录 一维前缀和 构建一维前缀和数组 子序列的和 二维前缀和 构建二维前缀和数组 子矩阵的和 一维前缀和 一维前缀和很简单 就是高中数学中的前n项和 设有一个数组a a a 1 a 2 a 3 a 4 a 5 a 6 a n 还有一个数
  • C++ 之指针

    文章目录 参考 描述 指针 运算符 地址运算符 奇偶分体 指针的创建 间接寻址运算符 句点运算符 运算符优先级问题 箭头运算符 运算符优先级 指针 野指针 空指针 通用指针 解引用 分析 指针的算术运算 加减运算 自增运算与自减运算 比较运