C语言中函数名与取地址操作有何内在联系及区别,构成何种复杂关系?

2026-04-16 23:030阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计361个文字,预计阅读时间需要2分钟。

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); } [[emailprotected] 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]。即他们的值相同,但指向的类型不同。

阅读全文

本文共计361个文字,预计阅读时间需要2分钟。

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); } [[emailprotected] 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]。即他们的值相同,但指向的类型不同。

阅读全文