c++ - 具有两个间接运算符 (C++) 的函数参数的用途
问题描述
具有两个间接运算符的函数参数的目的是什么?
由于引用调用正在更改原始变量的值,我认为带有两个间接运算符的函数参数可能会更改原始值的地址。
但正如我在下面的尝试所示,它没有:
void addrchanger(int**);
int main()
{
int value1 = 4;
int* value1ptr = &value1;
std::cout<<&value1<<std::endl;
addrchanger(&value1ptr);
std::cout<<&value1<<std::endl;
//the address of value1 doesn't change.
}
void addrchanger(int** foo)
{
//this is an attempt to change the address of value1 to the next slot
++**foo;
}
解决方案
目的是传递指向指针的指针或指向数组的指针。对于 main() 之类的历史函数,这种做法类似于 C char** argv
(这就是为什么您还需要一个 argc,因为指针不能推断出大小)。当您想要返回一个指针时也使用它,因此您将一个指针传递给一个指针,就像在许多 Win32 函数中一样。
HRESULT StringFromIID(
REFIID rclsid,
LPOLESTR *lplpsz
);
您将传递一个双指针作为第二个参数(a wchar_t**
),以便返回一个指针,它们必须像文档所说的那样被释放。
现在在 C++ 中完全避免这种情况,并在必要的任何深度使用 std::vector。
推荐阅读
- google-apps-script - Google Apps 脚本:找不到方法 createAllDayEvent(string,string,object)
- java - 检查 ArrayList 中每个立方体的碰撞
- clang-format - 格式化结构/类宏定义
- laravel - 将特定的数组值放入 Laravel 视图表中
- sql - 将位图存储到适当的列 - Oracle
- sql - SQL:根据用户注册表和事件日志计算第一天的留存率
- spring-boot - 如何在spring/stomp websocket中推送注销用户或刷新用户页面
- sql-server - 如何修复无法绑定多部分标识符
- linux - QSqlDatabase:未加载 QMYSQL 驱动程序
- javascript - 在 angularjs 控制器中重用功能