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

Jr7*_*795 6 c pointers memory-address

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

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

如果是这样的话,那么为什么一个指针只保存一个内存地址呢?(或者更确切地说,如果它可以容纳更多内容,则在打印时仅显示一个?)。这只是存储 int 的第一个地址吗?(假设它们是连续存储的)。

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

Sha*_*ger 7

是的,从技术上讲,您所描述的内容将有四个可寻址字节int。但指针指向第一个字节,int从中读取该字节和随后的三个字节来构造该int值。

如果您尝试从引用其他三个字节之一的指针中读取数据,至少您会得到一个不同的值(因为它会读取 one 的剩余部分int以及它旁边的其他字节),并且在某些情况下如果架构需要对齐读取(因此四个字节值必须从可被四整除的地址开始),您的程序可能会崩溃。

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