C中指针的值

Value of Pointer in C

我已经开始学习 C(所以,你知道..指针)。

我有这个代码:

#include <stdio.h>
#include <string.h>

int main (int argc, char* argv[])
{
    char c = 'c';
    char* cptr = &c;

    printf("c = %c\n", c);
    printf("*cptr = %c\n", *cptr);  
    printf("c address = %p\n", &c);  
}

我的输出是:

c = c
*cptr = c
c address = 0x7fff0217096f

当我将上面的十六进制转换为十进制时,我得到:140720994002157

我的问题:

1) 这个十进制值代表的是内存地址吗?是不是太大了?

2) 如何将指针的值(即 c 变量的地址)打印为十进制?

1).您应该将地址打印为 printf("c address = %p\n", &c);。现在您尝试打印存储指针变量本身的地址,这可能没有多大意义。

也就是说,它可能仍然是一个有效地址,假设是 64 位地址。

2).您必须安全地将其转换为一个整数,该整数保证足够大以包含指针地址:

#include <inttypes.h>

printf("c address = %" PRIuPTR "\n", (uintptr_t)&c);

Isn't [the address] too big?

这是一个虚拟地址,也就是说它的数值不一定代表字节在物理内存中的序号。此外,不同的进程可能会在同一个虚拟地址保存不同的数据,因为每个进程都有自己的地址 space.

How can I print the value of the pointer in an integer format?

使用uintptr_t将指针表示为整数值,然后使用PRIuPTR宏打印:

#include <stdio.h>
#include <inttypes.h>

int main(void) {
    char c = 'x';
    char *p = &c;
    uintptr_t x = (uintptr_t)p;
    printf("Pointer as decimal: %"PRIuPTR"\n", x);
    return 0;
}

Demo.