dik*_*era 4 c++ pointers function-pointers
我遇到过这段代码
inline pthread_t CreateThread(void(*pfn)(void*), void* parg, bool fWantHandle=false)
Run Code Online (Sandbox Code Playgroud)
我不明白这一部分
void(*pfn)(void*)
Run Code Online (Sandbox Code Playgroud)
有人能告诉我这是什么意思吗?
这是btw没有在初学者的书籍中列出,所以如果你想提到阅读书籍,它不存在.
Afaik,void是一个函数的数据类型,意味着它不会返回任何东西,但是那个部分......指针上使用了void?
它是一个返回void和接受函数的函数指针void *.
void example(void *arg);
Run Code Online (Sandbox Code Playgroud)
您可以在The Function Pointer Tutorials中找到有关C++(和C语言)中函数指针的更多信息.
这些内容最简单易读:
(*pfn)>" pfn是一个指针"void x(void*)>>" x是接受void *参数并返回的函数void"把它们放在一起,你有:
pfn是指向接受void *参数并返回的函数的指针void"请注意,(*pfn)由于优先权,周围的parens 是必要的.void *pfn(void*)将被解释为如果它被写(void *)pfn(void *):" pfn是一个接受a void *并返回void *" 的函数.
这是一个函数指针(或指向函数的指针).
void(*pfn)(void*)
Run Code Online (Sandbox Code Playgroud)
这样就分解了:
*pfn (指针的名称,即指向函数的指针)
(void *) (这些是函数的参数,即指向任何东西的简单指针)
void (这是从函数返回)
所以,如果你有这样的功能:
void DoSomeThing(void *data) {
... does something....
}
Run Code Online (Sandbox Code Playgroud)
然后你就可以把它传递给CreateThread函数了......
int i = 99;
void * arg = (void*)&i;
pthread_t thread = CreateThread(DoSomeThing, arg, ... other parameters ...);
Run Code Online (Sandbox Code Playgroud)
所以CreateThread它的某个地方会打个电话:
pfn(parg);
Run Code Online (Sandbox Code Playgroud)
并且你的函数DoSomeThing将被调用,void * data你得到的将是你传入的arg.
更多信息:
请记住,代码只是内存中的一个字节序列.这就是cpu如何解释它们使它们与我们称之为数据的东西不同.
因此,在程序的任何一点,我们都可以通过它的内存地址来引用代码的另一部分.由于代码被分解为C语言中的函数,因此这是一个有用的重用单元,C理解并允许我们将函数的地址视为另一个指向某些数据的指针.
在上面的示例中,CreateThread函数需要函数的地址,以便它可以在新线程中执行该函数.所以我们传给它一个指向该函数的指针.因此我们传递一个函数指针.
| 归档时间: |
|
| 查看次数: |
2231 次 |
| 最近记录: |