为什么以及如何解除引用函数指针只是"什么都不做"?
这就是我所说的:
#include<stdio.h>
void hello() { printf("hello"); }
int main(void) {
(*****hello)();
}
Run Code Online (Sandbox Code Playgroud)
来自这里的评论:
函数指针解除引用就好了,但生成的函数指示符会立即转换回函数指针
从这里的答案:
解除引用(以你认为的方式)函数的指针意味着:访问CODE内存,因为它将是一个DATA内存.
不应该以这种方式取消引用函数指针.相反,它被称为.
我会使用"dereference"这个名字与"call"并排使用.没关系.
无论如何:C的设计方式是函数名称标识符和变量保持函数的指针都是相同的:地址到CODE内存.它允许通过在标识符或变量上使用call()语法来跳转到该内存.
如何准确地不提领一个函数指针的工作?
令人惊讶的是,无论在函数名之前使用什么符号,以下代码在 gcc 和 clang 中都能很好地编译:*,&或者什么都不用。标准是否允许其中任何一个?存储函数指针的首选方法是什么?
#include <stdio.h>
typedef int foo(int a);
template <typename X>
int g(int y) {
return y * sizeof(X);
}
int main() {
foo* xxx;
// 1. what is correct according to standard?
// 2. why they all work?
xxx = *g<float>;
xxx = &g<float>;
xxx = g<float>;
printf("ok %d\n", xxx(5));
}
Run Code Online (Sandbox Code Playgroud) 我知道void (*)(int)是函数指针但是是什么void(int)?
它用于std::function模板.
说我有一个功能void fun(int){}:decltype(&fun)给予void(*)(int)但decltype(fun)给予void(int)
在此示例代码中,func1是void (*)(int, double)和funky的类型void(&)(int, double).
#include <iostream>
using namespace std;
void someFunc(int i, double j) {
cout << i << ":" << j << endl;
}
int main(int argc, char *argv[]) {
auto func1 = someFunc;
auto& func2 = someFunc;
cout << typeid(func1).name() << endl;
cout << typeid(func2).name() << endl;
func1(10, 20.0);
func2(10, 30.0);
}
Run Code Online (Sandbox Code Playgroud)
输出显示了差异:
PFvidE
FvidE
10:20
10:30
Run Code Online (Sandbox Code Playgroud)
实际上,这两种类型有什么区别?
//test.cpp
#include <type_traits>
double* func() {}
static_assert(std::is_same<double*(*)(), decltype(func)>::value, "");
int main() {}
Run Code Online (Sandbox Code Playgroud)
编译命令:
g++ -std=c++11 -c test.cpp
Run Code Online (Sandbox Code Playgroud)
输出:
test4.cpp:6:1: error: static assertion failed:
static_assert(std::is_same<double*(*)(), decltype(func)>::value, "");
^
Run Code Online (Sandbox Code Playgroud)
上面的代码有什么问题?我该如何解决?