c++内存地址
C++ Memory addresses?
内存地址是如何工作的?
在32位内存地址是一个十六进制值像0x0F032010,对吗?但是这些值是指向字节还是指向位呢?
在两个内存地址之间,比如0x0F032010和0x0F032011
在32位内存地址是一个十六进制值像0x0F032010,对吗?
它是一个数字。内存中的一个位置。它以内存的起始和结束为界,即开始于某个值,结束于某个值。
但是这些值是指向字节还是指向位?
一般认为地址指向最小的可寻址单位,即字节。大多数现代cpu都是这样定义的。然而,情况并非总是如此。
两个内存地址之间是什么,比如0x0F032010和0x0F032011
龙。或者什么也没有,因为它们之间没有任何东西。
在C和c++中,地址最终指向与char
相同大小的东西——一个"字节"。这就是语言中的称呼层次。这是否真的是当前机器的寻址水平是另一个问题。字节的位数又是另一个问题。
c++(或C)地址或指针值最好被认为指向对象,而不一定指向字节。指针算术是根据所指向对象的大小来定义的,所以增加int*
的值会给你一个指向相邻int
对象的指针(它可能在内存中多了4个字节)。
在机器级别,假设一个典型的线性单字节寻址内存模型,指针被实现为机器地址,每个地址实际上是一个引用单个字节的数字。int*
指针值包含它所指向的int
对象的第一个字节的地址。对c++ int*
指针进行自增是通过在机器地址上添加sizeof (int)
(例如,4)来实现的。
就c++而言,指针不是整数;它们只是指针。可以使用强制类型转换在指针值和整数值之间进行转换,结果对于底层机器的内存模型来说应该是有意义的,但是对结果并没有多少保证。你可以在指针上执行算术运算,但在语言层面上,这与整数运算完全不是一回事(尽管它可能在机器层面上被实现为缩放的整数运算)。
我所描述的内存模型并不是唯一可能的模型,C和c++都有意设计为允许其他模型。例如,您可以有一个模型,其中每个单独的对象都有自己的内存空间,指针或地址是由标识对象的东西加上该对象内的偏移量组成的复合值。给定int x; int y;
,您可以比较它们的地址是否相等(&x == &y
将为假),但&x < &y
的行为是未定义的;甚至不要求&x < &y
和&y < &x
有相反的值。
c++内存模型在典型的32位平面内存模型上工作得非常好,您可以将指针视为数字。但是c++模型是足够抽象的,它也可以在其他模型之上工作。
你既可以用语言定义的抽象术语来考虑指针和地址,也可以用机器实现的具体术语来考虑。他们的思维模式完全不同,但最终是兼容的。同时在脑子里想这两件事是很棘手的。
这些值本身没有什么意义,只是数字。内存地址只是一个与内存字节相对应的数字,就像你家的街道地址一样。这只是一个数字。
地址可以指向的最小单位是字节,所以地址指向字节;你可以想到你房子左边的地址;实际的房子(组成字节的比特)位于你的地址(指向你房子的左边)和你隔壁邻居的地址(指向他房子的左边)之间。但是中间没有其他地址
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 在C++中打印指向不同基元数据类型的指针的内存地址
- CUDA:统一内存和指针地址的更改
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 使用内存地址访问结构的属性值
- 如何读取特定地址的进程内存?
- 为什么C++总是显示十六进制内存地址,而不仅仅是整数?
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 将布局映射到内存地址
- 为什么同一个变量的内存地址不同?
- LLVM 传递以在特定地址分配内存
- 无法将内存地址转换为值
- 是否可以仅通过将分配的指针地址存储在C++中来分析内存?
- 给定特定内存地址的数组的动态内存分配
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- 获取 R 数据帧的内存地址
- 如何配置bazel以运行地址/内存清理器?
- 存储 std::list 元素的地址;内存
- 确定库的地址内存