C++ C++;,参数类型(void*&;)的用途是什么?

C++ C++;,参数类型(void*&;)的用途是什么?,c++,C++,我试图理解某个代码,在那里我发现了一些难以理解的东西 void BPlusTree::GetKey(int key, void*& keyloc) const { keyloc = keys + key * attrLength; return 0; } 此函数计算键值的位置(内存地址),并将其存储在keyloc变量中 void*&表示对void指针的引用 这里的reference用于将keyloc的更改值反映到名为'GetKey'的外部函数 我到现在还对吗 所以我认为

我试图理解某个代码,在那里我发现了一些难以理解的东西

void BPlusTree::GetKey(int key, void*& keyloc) const {
    keyloc = keys + key * attrLength;
    return 0;
}
此函数计算键值的位置(内存地址),并将其存储在
keyloc
变量中

void*&
表示对void指针的引用

这里的reference用于将
keyloc
的更改值反映到名为'GetKey'的外部函数

我到现在还对吗

所以我认为,在main函数中,当它调用
GetKey
函数时。它需要通过
(void*)
而不是
(void*&)

为什么这里用
(void*&)
代替
(void*)

多谢各位

//我在这里添加了示例代码

#include <regex>
#include <iostream>
#include <stdlib.h>

using namespace std;
#include <stdio.h>

void foo(int &a, int &b) {
a = 10;
b = 20;
}

void foo2(int* &c, int* &d) {
*c = 10;
*d = 20;
}

void foo3(void* &c, void* &d) {
*(int*)c = 10;
*(int*)d = 20;
}

int main(void) {
int a = 0;
int b = 0;
int* c = new int;
int* d = new int;
void* e = malloc(sizeof(int));
void* f = malloc(sizeof(int));

foo(a, b);
printf("A is %d and B is %d\n", a, b);

foo2(c, d);
printf("C is %d and D is %d\n", *c, *d);

foo3((void*&)c,(void*&) d);     // It works fine
printf("C is %d and D is %d\n", *c, *d);

foo3((void*)c,(void*) d);       // But it does not work
printf("C is %d and D is %d\n", *c, *d);
}
#包括
#包括
#包括
使用名称空间std;
#包括
无效foo(内部和a、内部和b){
a=10;
b=20;
}
无效foo2(int*&c、int*&d){
*c=10;
*d=20;
}
无效foo3(无效*&c、无效*&d){
*(int*)c=10;
*(int*)d=20;
}
内部主(空){
int a=0;
int b=0;
int*c=新的int;
int*d=新的int;
void*e=malloc(sizeof(int));
void*f=malloc(sizeof(int));
foo(a,b),;
printf(“A是%d,B是%d\n”,A,B);
foo2(c,d);
printf(“C是%d,d是%d\n”,*C,*d);
foo3((void*&)c,(void*&)d);//它很好用
printf(“C是%d,d是%d\n”,*C,*d);
foo3((void*)c,(void*)d);//但它不起作用
printf(“C是%d,d是%d\n”,*C,*d);
}

(void*)有问题吗??:是的,你所理解的基本正确。最后一点,在解释中使用指针而不是引用可能会更容易

你本来可以

void BPlusTree::GetKey(int key, void** keyloc) const { ... };
还有一个打电话的

char* key = NULL;
int result = currNode->GetKey(currPos, (void**) &key);
在这里,很明显为什么不能使用
&(void*)键
(void*)键
是一个右值,不能获取它的地址。这就像获取
(key+0)
的地址一样。当然,
key+0
始终只是
key
,但事实上,这里有一个加法,这意味着您看到的是指针值的副本,而不是原始指针对象

在处理引用时,没有像指针那样的显式“address of”操作,但问题是相同的
GetKey(currPos,(void*)键)
不起作用,因为
(void*)键
是右值,而不是左值
(void*&)键
转换为“引用
void*
”,意思是
*(void**)和键
。可以假装
实际上被定义为
void*


注:这通常被认为是非常糟糕的做法
key
实际上最好定义为
void*
,然后不需要强制转换来调用
GetKey

如果它是void*,key将是原始void*的副本,这意味着当修改keyloc时,将修改副本,而不是原始密钥。由于key是对原始key的引用,因此原始key被修改(分配给)@nurettin,这适用于参数。但是,真的有必要将论点转换为
void*&
(反问)?请发布一些真实的、自包含的编译代码。@juanchopanza我添加了一个示例代码。感谢您的解释!是否仅针对(void*)的特定情况??我想在使用它之前我需要研究一下(void*)。@SeongYunKo当您将数据存储在某个数据类型中,并试图通过引用(或指针)将其传递给需要不同数据类型的函数时,这是一个普遍的问题。
char* key = NULL;
int result = currNode->GetKey(currPos, (void**) &key);