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

时间:2014-08-29 06:50:17

标签: c++

我试图理解某些代码,我发现了一些难以理解的东西。

void BPlusTree::GetKey(int key, void*& keyloc) const {
    keyloc = keys + key * attrLength;
    return 0;
}

此函数计算键值的位置(内存地址)并将其存储在keyloc变量。

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

此处引用用于将keyloc的更改值反映到名为`GetKey的外部函数。

我到现在为止?

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

int main() {
.....
int currPos = 0;
char* key = NULL;
int result = currNode->GetKey(currPos, (void*&) key);
}

为什么在这里使用(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);
}

(void *)有问题吗? :d

1 个答案:

答案 0 :(得分:3)

是的,你对自己的理解非常正确。对于最后一点,也许在解释...中使用指针而不是引用会更容易。

你本可以

void BPlusTree::GetKey(int key, void** keyloc) const { ... };

和来电者

char* key = NULL;
int result = currNode->GetKey(currPos, (void**) &key);

在这里,显而易见的是,为什么你不能使用&(void*) key(void*) key是一个右值,你不能使用它的地址。这就像取(key + 0)的地址一样。当然,key + 0总是只有key,但只是你有一个附加的事实意味着你正在查看指针值的副本,而不是原始指针对象。

在处理引用时,没有像指针那样明确的“地址”操作,但问题是相同的。 GetKey(currPos, (void*) key)不起作用,因为(void*) key是右值,而不是左值。 (void*&) keykey投射到“引用void*”,几乎意味着*(void**) &key。这样做是为了假装key实际上被定义为void*

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