参考
项目 |
描述 |
精通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
请按任意键继续. . .
注:
- 内存地址前的 0x 表明该内存地址是以十六进制的格式进行显示的。
- 在默认情况下,通过 & 运算符向控制台输出的内容为十六进制格式的内存地址。相比于十六进制的格式的内存地址,你可能更愿意观察十进制格式的内存地址。为此,你可以通过在 &标识符 前添加 (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
请按任意键继续. . .
- 你可以通过如下方式来得知计算机的地址使用多少个字节进行表示:
#include <iostream>
#include <string>
using namespace std;
int main(){
// 此处可以声明任意类型的指针,因为在一台计算机中,
// 内存地址均使用相同个数的字节进行表示。
int* a;
// 通过 sizeof 运算符来获取指针所占用的内存空间
cout << sizeof a << endl;
system("pause");
}
执行结果
由于我的计算机支持 64 位 操作系统,而我使用的也是 64 位 的操作系统。因此,内存地址使用八个字节(一个字节包含八位,也即八个比特)进行表示。
8
请按任意键继续. . .
奇偶分体
在使用 C++ 指针时,你可能会发现这么一个现象:若变量或常量存储的数据的数据类型所占用的内存空间不止一个字节,那么该变量或常量的地址多为偶地址。
奇地址与偶地址
-
奇地址
若一个内存地址属于奇数,那么该地址将被认为是一个奇地址。
-
偶地址
若一个内存地址属于偶数,那么该地址将被认为是一个偶地址。
奇偶分体
为了实现存储器的字节寻址及整字(占用内存空间的大小为两个字节)读写功能,人们将存储器分成容量相等(占据相同的内存空间大小,该空间大小为一个字节)的两类存储体,即奇存储体与偶存储体。
奇存储体所占据的内存空间所对应的地址为奇地址,而偶存储体所占据的内存空间所对应的地址为偶地址。
寻址与整字读取功能
- 寻址
存储器能够通过传输过来的内存地址对内存单元进行查找。
- 整字读取功能
为了充分利用数据总线的传输能力,CPU 从内存中读取数据将以一个字为单位进行读取。且字的起始内存地址需为偶地址(原因暂不明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)