对一些基本数据类型的指针进行类型转换(内部发生的事情)

时间:2016-03-08 15:33:17

标签: c

将指针强制转换为基本数据类型时会发生什么。为什么我们得到一些价值?

例如:

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

两个打印报表都打印不同的值......

2 个答案:

答案 0 :(得分:0)

printf("%p",ph);

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

printf("%d",ph);

说 - "看到那块内存,它是一个整数,请加载它并打印成人类可读的基数10#"

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

第二个行为取决于系统上int和指针的大小和表示。价值是真的'一个指针,但你告诉运行时它是一个int。在许多系统上,指针和整数是32位。在这种情况下,加载将加载32位,并且打印将这些位解释为int并打印出指针的基数10值。在其他系统上,指针可能是64位,int仍然是32位。既然你不知道你得到什么价值它很难知道最新情况但是如果我不得不猜我会说你得到的是相同的值,一个是十六进制,另一个是十进制

请注意,第二个是什么叫做“未定义的行为”,你对系统撒谎:可能发生不好的,混乱的,无法解释的事情

答案 1 :(得分:-1)

此程序具有未定义的行为。实际参数ph(int*)的类型与格式说明符"%d"不匹配。它可以打印任何东西或什么都不会,只会让你的PC爆炸。