有趣的指针转换实验
1.
#include <stdio.h>
void Function()
{
printf("Call Function!\n");
}
int main()
{
void (*p)();
printf("p=%p &p=%p\n", p,&p); //p是一级指针,&p是二级指针
// printf("(int *)&p=%p (int **)\n", (int *)&p);
// *(int *)&p = (int)Function;
// (*p)();
return 0;
}
打印结果:p=0x8048499 &p=0xbf87b71c
2.
#include <stdio.h>
void Function()
{
printf("Call Function!\n");
}
int main()
{
void (*p)();
printf("p=%p &p=%p\n", p,&p); //p是一级指针,&p是二级指针
printf("(int *)&p=%p (int **)&p=%p\n", (int *)&p, (int **)&p);
//第一个强转成int类型的一级指针, 第二个强转成int类型的二级指针, 所以地址值还是函数指针p的二级指针值
//此时的两个变量p的值虽然相同,但是指针类型已经不同,一个属于一级指针,另一个属于二级指针,可做如下实验验证:
int a=5;
(int *)&p; // (int **)&p;
p = &a;
// *(int *)&p = (int)Function; 思考:为什么*&p = Function 与 *(int *)&p = Function 结果一样
// (*p)();
return 0;
}
打印结果: p=0x80484a9 &p=0xbf9ecc3c
(int *)&p=0xbf9ecc3c (int **)&p=0xbf9ecc3c
3.
#include <stdio.h>
void Function()
{
printf("Call Function!\n");
}
int main()
{
void (*p)();
printf("p=%p &p=%p\n", p,&p); //p是一级指针,&p是二级指针
//第一个强转成int类型的一级指针, 第二个强转成int类型的二级指针, 所以地址值还是函数指针p的二级指针值
printf("(int *)&p=%p (int **)&p=%p\n", (int *)&p, (int **)&p);
//该表达式解释为,将&p"二级指针"强转为int类型的一级指针"(int *)&p",但是还是二级指针值。
//接着对该一级指针取内容变为int的类型整数表达式"*(int *)&p",并把(int)Function赋值给*p
//注:此时的p已经是int类型的一级指针了
*(int *)&p = (int)Function;
// (*p)();
return 0;
}
打印结果: p=0x95d6d0 &p=0xbfb91330
(int *)&p=0xbfb91330 (int **)&p=0xbfb91330
Call Function!