【发布时间】:2017-11-03 23:00:45
【问题描述】:
什么是函数名?它与指向它的指针有什么关系?为了尝试理解这些问题,编写了以下代码:
#include <stdio.h>
int testFunc(void);
void ptrFuncProp(void);
int main(){
ptrFuncProp();
return 0;
}
void ptrFuncProp(void){
int i = 0;
int (*p_testFunc)(void) = testFunc;
testFunc();
(*testFunc)();
p_testFunc();
(*p_testFunc)();
printf("testFunc:\t%d\n*testFunc:\t%d\n",sizeof(testFunc),sizeof(*testFunc));
printf("p_testFunc:\t%d\n*p_testFunc:\t%d\n",sizeof(p_testFunc),sizeof(*p_testFunc));
putchar('\n');
printf("testFunc:\t%c\n",testFunc);
printf("*testFunc:\t%c\n",*testFunc);
printf("*p_testFunc:\t%c\n",*p_testFunc);
for(;*p_testFunc && i<30;i++){
printf("%c ",*(p_testFunc + i));
if(i%10 == 9){
putchar('\n');
}
}
}
int testFunc(void){
int i=0;
printf("output by testFunc\n");
return 0;
}
输出如下:
在代码中,定义了一个简单的函数testFunc,并有一个指针p_testFunc指向它。我在网上了解到,我尝试了四种方法来调用这个函数;它们都可以工作,虽然我不太明白。
接下来的两行试图弄清楚函数名和它的指针到底是什么。我能理解的一点是 p_testFunc 是一个指针,所以它包含其他东西的地址;地址是 8 个字节。但是为什么函数名的大小是1字节,因为我以前认为函数名是一个const指针,其内容是函数的开始地址。如果函数名不是指针,怎么解引用?
实验结束后,问题仍未解决。
【问题讨论】:
-
printf("%c ",*(p_testFunc + i));是 UB,如果我没记错的话。 -
@SouravGhosh 你不是。 stackoverflow.com/questions/5085366/…
-
函数 name 是编译器和链接器的标识符。函数 pointer 指向一个函数,与它的名称无关(如果正确声明,函数指针将要求只有 [the address of] 兼容函数分配给它)。通过调用函数指针来取消引用它(编译器会为您取消引用它)。
-
您使问题复杂化了。大多数函数都是直接调用的。有时需要在函数和调用者之间插入一个间接层,即函数指针。像其他指针一样,它包含一个地址。与其他指针不同,您不需要 * 来取消引用它。
-
可能对我目前的学习阶段来说太深了。