• 有趣的指针转换实验


    1.

    #include <stdio.h>

    void Function()
    {
        printf("Call Function! ");
    }

    int main()
    {
        void (*p)();
        printf("p=%p &p=%p ", p,&p);           //p是一级指针,&p是二级指针
    //  printf("(int *)&p=%p (int **) ", (int *)&p);
    //  *(int *)&p = (int)Function;
    //  (*p)();

        return 0;
    }

    打印结果:p=0x8048499 &p=0xbf87b71c

    2.

    #include <stdio.h>

    void Function()
    {
        printf("Call Function! ");
    }

    int main()
    {
        void (*p)();
        printf("p=%p &p=%p ", p,&p);           //p是一级指针,&p是二级指针

        printf("(int *)&p=%p (int **)&p=%p ", (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! ");
    }

    int main()
    {
        void (*p)();
        printf("p=%p &p=%p ", p,&p);           //p是一级指针,&p是二级指针

        //第一个强转成int类型的一级指针, 第二个强转成int类型的二级指针, 所以地址值还是函数指针p的二级指针值
        printf("(int *)&p=%p (int **)&p=%p ", (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!

  • 相关阅读:
    MFC框架程序实现十一
    MFC框架程序实现八
    MFC框架程序实现十二
    在Visual C++中如何利用UDL文件来建立ADO连接
    OnePage收集 HA
    微博跳转的url HA
    淘宝iosapp调用规范 HA
    Excel操作相关 HA
    C#GDI+编程基础 HA
    html5deoms HA
  • 原文地址:https://www.cnblogs.com/kaijia9/p/3352059.html
Copyright © 2020-2023  润新知