关于DirectX中指针、双指针与引用语法的解析及应用问询
CreateGizmoTron系列函数实现与语法解析
可编译的C++实现代码
#include <iostream> // 测试用变量,模拟DirectX中常见的基础类型与指针场景 int alpha = 10; int beta = 20; int* pBeta = β int* pGamma = new int(30); int* pDelta = new int(40); // CreateGizmoTron1:接收普通变量的地址,修改原变量值 void CreateGizmoTron1(int* val) { if (val != nullptr) { (*val)++; } } // CreateGizmoTron2:接收指针值,修改指针指向的内容 void CreateGizmoTron2(int* val) { if (val != nullptr) { (*val)++; } } // CreateGizmoTron3:接收指针的地址(双指针),可修改指针指向或指向的内容 void CreateGizmoTron3(int** val) { if (val != nullptr && *val != nullptr) { (**val)++; // 若需修改指针指向:*val = new int(50); // 这是DirectX创建资源的典型逻辑 } } // CreateGizmoTron4:接收通用双指针,适配跨类型接口场景 void CreateGizmoTron4(void** val) { if (val != nullptr) { int* p = static_cast<int*>(*val); if (p != nullptr) { (*p)++; } } } int main() { // 按示例调用函数 CreateGizmoTron1(&alpha); CreateGizmoTron2(pBeta); CreateGizmoTron3(&pGamma); CreateGizmoTron4((void**)&pDelta); // 输出自增后的结果 std::cout << "alpha: " << alpha << std::endl; // 输出11 std::cout << "*pBeta: " << *pBeta << std::endl; // 输出21 std::cout << "*pGamma: " << *pGamma << std::endl; // 输出31 std::cout << "*pDelta: " << *pDelta << std::endl; // 输出41 // 释放动态分配的内存 delete pGamma; delete pDelta; return 0; }
各函数语法解析与适用场景
1. CreateGizmoTron1(&alpha)
- 语法逻辑:调用时传
&alpha是取普通变量的内存地址,函数用int*(单指针)接收。本质是值传递指针副本,但通过解引用*val可以直接操作原变量的内存空间,实现"输出参数"的效果。 - 适用场景:DirectX中需要修改基础类型变量(比如状态码、配置数值)的场景,例如获取函数执行后的错误码,或调整某个渲染参数的值。
2. CreateGizmoTron2(pBeta)
- 语法逻辑:
pBeta本身是指向beta的指针,直接传递的是指针的副本(值传递)。函数只能修改指针指向的内存内容,无法改变pBeta本身的指向(比如让它指向另一个变量)。 - 适用场景:DirectX中已明确指针指向有效资源,仅需修改资源内部数据的场景,例如修改已创建的顶点缓冲区中的顶点数据。
3. CreateGizmoTron3(&pGamma)
- 语法逻辑:传
&pGamma是取指针变量的地址,函数用int**(双指针)接收。通过*val可以直接操作原指针变量的内存,既能修改指针指向的内容,也能让原指针指向新分配的内存(这是DirectX创建资源的核心逻辑)。 - 适用场景:DirectX中创建资源的核心场景,比如
ID3D11Device::CreateBuffer、ID3D11Device::CreateTexture2D这类函数,需要在函数内部创建资源后,将资源指针赋值给外部传入的指针变量,必须用双指针实现。
4. CreateGizmoTron4((void**)&pDelta)
- 语法逻辑:
void**是通用双指针类型,用于实现跨类型的通用接口。调用时将具体类型的指针地址强制转换为void**,函数内部再转换回原类型操作。这种设计避免为每个接口类型写重载函数,实现类型无关的通用接口。 - 适用场景:DirectX中通用接口创建或获取场景,比如
CreateDXGIFactory、D3D11CreateDevice这类函数,需要返回不同类型的COM接口指针,用void**作为参数可以兼容所有接口类型。
内容的提问来源于stack exchange,提问作者SojourningStudent
相关产品推荐
相关产品推荐

