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;
}
我已经开始学习 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;
}