c++ - 这个类型转换意味着什么?

标签 c++ c type-conversion

我看到一段这样的代码:

#include <windows.h>
static VOID (WINAPI * pFun) (DWORD seconds) = NULL;

void foo(PVOID * par){
    return;
}

int main(){
    foo(&(PVOID&) pFun); // type-cast 1
    foo((PVOID *) (&pFun)); // type-cast 2
    return 0;
}

我可以理解类型转换 2,但是类型转换 1 是如何工作的?

最佳答案

首先,您使用的是 C++。

windows.h中,VOIDPVOID被定义为voidvoid*分别。

#define VOID void

typedef void *PVOID;

让我们看一个基本程序:

#include <iostream>

using namespace std;

void foo(void** pp)
{
  int i = *((int*) *pp);
  cout << i << endl;
}

int main()
{
  int i = 10;
  int *p = &i;

  foo((void**) &p); // call #1
  foo(&(void*&) p); // call #2
}

在第一种情况下,我们获取 p 的地址,即 int**,并将其传递给 foo() 将其强制转换为 void**

在第二种情况下,我们首先将 p 转换为 void*&,然后获取其地址,该地址为 void**,并将其传递给 foo()。它是 void*& 而不是 void* 的原因是您只能在 lvalue 上使用一元 & 运算符(地址) .

关于c++ - 这个类型转换意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9658376/

相关文章:

将字符串转换为十六进制、十进制和八进制

c++ - 不能调用基类保护函数?

C++ 递归段错误

c++ - OpenGL Fog不出现

c - 使用 typedef 和结构理解 C 代码

c - 如何在C中使用 "anonymous"管道进行进程同步?

c++ - 从特征矩阵中外部化数据

c - 如何用c语言准确描述进程状态(如初始化、运行、等待等)?

r - 将 R 中的高度从英尺 (6-1) 转换为英寸 (73)

javascript - 如何在javascript中将String变量转换为int?