函数名&函数名取地址

Posted sggggr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数名&函数名取地址相关的知识,希望对你有一定的参考价值。

有时看到如下的代码: 

/*****************************/
#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

以上是关于函数名&函数名取地址的主要内容,如果未能解决你的问题,请参考以下文章

数组名的地址,和数组名取地址的讨论

数组名a数组名取地址&a数组首地址&a[0]数组指针*p

为什么数组名取地址和数组名的取值一样

数组名和数组名取地址指针数组和数组指针的区别

数组题目分享

有没有办法将2个非常相似的代码片段组合成一个函数并重复?