有趣的指针转换实验

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!

posted @ 2013-10-05 00:37  kaijia9  阅读(214)  评论(0编辑  收藏  举报