zoukankan      html  css  js  c++  java
  • 函数名&函数名取地址

    有时看到如下的代码: 

    /*****************************/
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    void test()
    {
        printf("123456
    ");
    }
     
    int main(int argc, char *argv[])
    {
        printf("0x%x
    ",test);
        printf("0x%x
    ",&test);
    }
     
    [root@localhost pht]# ./a.out 
    0x8048328
    0x8048328

    按照&运算符本来的意义,它要求其操作数是一个对象,但函数名不是对象(函数是一个对象),本来&test是非法的,但很久以前有些编译器已经允许这样做, 
    c/c++标准的制定者出于对象的概念已经有所发展的缘故,也承认了&test的合法性。 

    因此,对于test和&test你应该这样理解,test是函数的首地址,它的类型是void (),&test表示一个指向函数test这个对象的地址, 
    它的类型是void (*)(),因此test和&test所代表的地址值是一样的,但类型不一样。test是一个函数,&test表达式的值是一个指针! 

    跟此问题类似的还有对一个数组名取地址。 
    int a[100]; 
    printf("%p ", a); 
    printf("%p ", &a[0]); 

    打印值一样。 
    但是数组名a,指向的是具有100个int类型的组数; 
    &a[0]指向的是元素a[0]。 
    即他们的值相同,但指向的类型不同。 

    转:"https://my.oschina.net/mavericsoung/blog/174110

  • 相关阅读:
    逆向
    BUUCTF
    学校健康系统自动打卡
    SQL数据库操作练习(3)
    简单尝试UPX脱壳
    网站WAF-安全狗的绕过(一)
    【题解】担心
    【题解】树上的鼠
    【题解】CF1299B Aerodynamic
    【题解】等你哈苏德
  • 原文地址:https://www.cnblogs.com/sggggr/p/12321343.html
Copyright © 2011-2022 走看看