c - 指向一些基本数据类型的指针的类型转换(内部发生的情况)

标签 c

当指针类型转换为基本数据类型时会发生什么。为什么我们会获得一些值(value)?

例如:

int h=4;
int * ph=&h;
printf("%p",ph);
printf("%d",ph);

两个打印语句打印不同的值...

最佳答案

printf("%p",ph);

对运行时说“看那边,内存是一个指针,请加载它并以十六进制打印出来”。请注意,这不是对编译器说的,编译器不知道 printf 在做什么(实际上大多数现代编译器都会偷偷看一下 printf 语句,您可能会收到警告)。

printf("%d",ph);

说 - “看到那 block 内存,它是一个整数,请加载它并将其打印为人类可读的基数 10 数字”

鉴于 ph 一个指向 int 的指针,第一个执行正确的操作,它打印出指针的值。

第二个的行为取决于系统上 int 和指针的大小和表示形式。该值“实际上”是一个指针,但您告诉运行时它是一个 int。在许多系统中,指针和整数都是 32 位。在这种情况下,加载将加载 32 位,并且打印会将这些位解释为 int 并打印出指针的基数 10 值。在其他系统上,指针可能是 64 位,而 int 仍然是 32 位。由于您没有说出您得到的值,所以很难知道发生了什么,但如果我不得不猜测,我会说您得到了相同的值,一个是十六进制,另一个是十进制

请注意,第二个是所谓的“未定义行为”,您对系统撒谎:可能会发生糟糕的、令人困惑的、无法解释的事情

关于c - 指向一些基本数据类型的指针的类型转换(内部发生的情况),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35871533/

相关文章:

c - 在 C 中使用 malloc 将文本文件读入数组

c++ - 在 C++/C 中获取错误的绝对值

c - 理解/澄清c代码的逻辑

c++ - 使用范围解析运算符传递函数指针arduino

c - 为什么结构体多了 3 个字节?可以去掉吗?

c - 使用重定向解决静态库中的 'undefined reference'

c - 函数指针赋值

c - 消息未发送: C socket

c - 鼠标指针在输入子系统中移动后无法模拟 Click 事件

c - 在 C 中,数组的名称是指向它第一个元素的指针,不是吗?