C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了C语言函数名以及取地址的区别和联系大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

有时看到如下的代码: 

/*****************************/
#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);
}

[[email protected] 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\n",a); printf("%p\n",&a[0]); 打印值一样。 但是数组名a,指向的是具有100个int类型的组数; &a[0]指向的是元素a[0]。 即他们的值相同,但指向的类型不同。 标准在其rationale中解释了这个问题,摘录如下: 6.5.3.2 Address and indirection operators Some implementations have not allowed the & operator to be applied to an array or a function. (The construct was permitted in early versions of C,then later made optional.) The C89 Language Committee endorsed the construct since it is unambiguous,and since data abstraction is enhanced by allowing the important & operator to apply uniformly to any addressable entity. 

大佬总结

以上是大佬教程为你收集整理的C语言函数名以及取地址的区别和联系全部内容,希望文章能够帮你解决C语言函数名以及取地址的区别和联系所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。