【发布时间】:2021-02-19 10:08:08
【问题描述】:
根据GNU C manual,可以使用函数指针调用函数,如下所示:
func (j); /* (*func) (j); would be equivalent. */
所以我的推理是:func 本身是一个指向func(int) 函数的指针。当您调用func(j) 时,您正在隐式访问指针func 的值(您正在移动到func 所在的内存位置),就像您有一个指向整数的指针时一样,例如,然后您使用* 访问存储在该内存位置中的值。这与您可以使用 (*func)(j) 调用相同的函数这一事实一致。
事实上,在cprogramming.com 中,他们说你可以拥有一个指向函数指针的指针。因此,我猜测它们的工作方式与任何其他类型的指针一样。
但如果是这样,为什么这段代码可以工作?
#include <stdlib.h>
#include <stdio.h>
void a(int n) {
printf("%d\n", num);
}
int main() {
int x = 5;
void (*func)(int); // Declare a pointer to a function
func = &a; // Pointer to a pointer to a function
(*func)(x); // Calls the function (why?)
func = a; // Pointer to a function
(*func)(x); // Calls the function (makes sense)
}
此外,如果你打电话:
printf("%s\n", (&a == a) ? "True" : "False");
打印True!
例如,我确定&foo 与&&foo 不一样,所以为什么func 似乎与&func 相同强>?
【问题讨论】:
-
数组也是如此。如果
a是一个数组,则a == &a为真。因为数组在用作指针时会退化为指向其第一个元素的指针。 -
@ikegami 比较可能成立,但如果
a是一个数组,a不等于&a。a是一个数组,可以转换为指向数组的第一个元素的指针。另一方面,&a是一个指向数组本身的指针。这就是char s[32]; scanf("%31s", &s);不好的原因。 -
@MikeCAT 我知道,它也不是函数。
标签: c function pointers function-pointers implicit-conversion