c语言里面 函数void func() 取地址&func 和 func值是一样的 .&func的作用是什么,为什么通过编译?


c语言里面 函数void func() 取地址&func 和 func值是一样的 .&func的作用是什么,为什么通过编译?

func就是函数的入口地址,&func又是什么?
  func是函数名,func是函数的入口地址;&func是指向函数func的指针(指针跟地址是两个概念),指针的值是函数的地址。但是函数名可以隐式转换成他的函数指针,所以输出func时和&func时是一样的.因为经过了这个转换。

有时看到如下的代码:
/*****************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void test()
{
    printf("123456\n");
}
int main(int argc, char *argv[])
{
    printf("0x%x\n",test);
    printf("0x%x\n",&test);
}
[root@H3C]# ./a.out
0x7025368
0x7025368  
  按照&运算符本来的意义,它要求其操作数是一个对象,但函数名不是对象(函数是一个对象),本来&test是非法的,但很久以前有些编译器已经允许这样做, c/c++标准的制定者出于对象的概念已经有所发展的缘故,也承认了&test的合法性。 因此,对于test和&test你应该这样理解,test是函数的首地址,它的类型是void (),&test表示一个指向函数test这个对象的地址, 它的类型是void (*)(),因此test和&test所代表的地址值是一样的,但类型不一样。test是一个函数,&test表达式的值是一个指针! 跟此问题类似的还有对一个数组名取地址。 
  int a[100];
  printf("%p\n", a);
  printf("%p\n", &a[0]);   
  打印值一样,但是数组名a,指向的是具有100个int类型的组数;   
  &a[0]指向的是元素a[0]。 即他们的值相同,但指向的类型不同。
 
转自:https://blog.csdn.net/weixin_30736301/article/details/102227702


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM