指针值是什么意思?

6 c pointers

考虑下面非常简单的代码:

#include <stdio.h>
#include <stdlib.h>
int main() {

    int* a = (int*) malloc(10 * sizeof(int));
    printf("a = %p, a+1 = %p", a, a+1);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是这样的:

a = 0x127f190, a+1 = 0x127f194
Run Code Online (Sandbox Code Playgroud)

由于a的大小int是4个字节,我假设从上面的结果开始,指针值就是我RAM内存上一个字节的索引.因此a+1实际上增加asizeof(int) = 4(字节)的值.那是对的吗?

如果是,那么为什么我从程序中获得32位内存地址?这台机器是64位运行64位版本的Ubuntu.如何让程序打印完整的64位地址?我是否必须使用特殊标志进行编译?

Chr*_*ber 7

你的指针是正确的.传统上,内存以字节为单位进行组织和寻址,指针指向它们指向的任何内容的第一个字节(编辑:它们不是必须的,但是在通常的平台和编译器上).

您没有看到"64位"指针只是因为输出剥离了前导0 :-)如果你执行sizeof(a),很可能在32位系统上得到"4",而"8"在64位系统上.


Ste*_*sop 4

RAM 内存中字节的索引

这对于大多数目的来说已经足够接近了,但并不完全准确。它是进程地址空间中字节的索引。虚拟地址不直接与物理 RAM 相关,有一个称为“虚拟内存管理器”的东西,负责跟踪每个进程中的哪些虚拟地址引用了哪些物理 RAM(以及 RAM 以外的东西)。

通常您可以忘记这一点,只需将虚拟地址空间视为 RAM(或“内存”以保持抽象)。但是不同进程中的同一个虚拟地址可以引用不同的物理内存,或者不同的进程中不同的虚拟地址可以引用同一个内存。或者,如果操作系统注意到该页面有一段时间没有使用,则将其交换到磁盘,然后在再次使用时返回内存,同一进程中的相同虚拟地址可能在不同时间引用不同的物理内存。因此,它实际上并不是 RAM 本身的“”地址,它只是操作系统为您的进程提供的地址,用于引用某些 RAM。