指针如何引用多字节变量?

How do pointers reference multi-byte variables?

我对 C 指针实际上如何引用变量的内存地址感到困惑。我可能在这里遗漏了一些东西,但是如果,例如一个 int 是 32 位(就像在 C 中一样),那么它将存储在 4 个字节中。

如果我没记错的话,每个内存地址的大小往往是一个字节,因为它们通常是可寻址内存的最小单位。那么如果一个int占用4个字节,那它岂不是有4个内存地址? (因为它存储在 4 个 8 位内存地址上)。

如果是这样,那怎么一个指针只能保存一个内存地址呢? (或者更确切地说,打印时只显示一个,如果它包含更多?)。这只是存储 int 的第一个地址吗? (假设它们是连续存储的)。

我试图在网上找到答案,但这只会导致进一步的混乱。

是的,从技术上讲,您描述的 int 将有四个可寻址字节。但是指针指向 first 字节,从中读取 int 会读取该字节和后续三个字节以构造 int 值。

如果您尝试从指向其他三个字节之一的指针读取,至少您会得到一个不同的值(因为它会读取一个 int 的剩余部分,并且它旁边的附加字节),并且在某些需要对齐读取的体系结构上(因此四个字节值必须从可被四整除的地址开始),您的程序可能会崩溃。

该语言试图保护您免于读取像那样未对齐的指针;如果您有一个 int*,并向其添加 1,它不会将原始地址递增 1,而是将其递增 sizeof(int)(对于您的情况,4 ),以便指向 int 数组的指针可以按值遍历数组,而不会意外读取逻辑上部分来自 int 部分来自其邻居的值。

指针指向你的类型的起始地址,如果你 google "pointer size" 它会告诉你它通常依赖于你的 cpu 体系结构,而不是你的原始类型或对象。

What is the size of a pointer?

尽管问题是关于 c++ 的,但希望能支持您的想法

一个字节是最小的寻址单位,但这并不意味着一个地址只有一个字节。否则你只能处理 256 个字节!指针的大小通常为 4 或 8 个字节

变量的地址是指它的第一个字节的地址。其余字节被理解为紧随其后,字节数是数据类型的一部分。

细节取决于机器的实际架构(什么样的 CPU,什么样的内存,等等)所以我假设你关心一个现代的 32 位处理器,其中有一个 int 和一个指针占用四个字节的内存。请记住,当整数是两个字节和指针是 8 个字节时,同样的想法适用,但我们必须只关注一组示例。

说了这么多,你是完全正确的,一个 int 使用四个连续的内存字节,这意味着它有四个独立的内存地址,而一个指针只包含一个地址 - 它是第一个字节的地址整数

所以 CPU 有一个读取 int 的指令。该指令获取 int 的第一个字节的地址并读取整个 int - 所有四个。这就是为什么您只需要一个地址来读取整个 int 的原因。所以 int i = 42 将一个四字节整数读入 i 并且该值被解释为表示数字 42。

但是指针也是一个整数,其值是一个内存地址,所以可以用完全相同的方式读取。因此 int *p = 42 将一个四字节整数读入 p,该值被解释为内存地址 42。

当您开始考虑字节的存储顺序时,所有这一切都会变得复杂,因此我们不会谈论它(但是,如果您想找出术语是字节顺序 - 请参阅 https://en.wikipedia.org/wiki/Endianness