我试图理解某些代码,我发现了一些难以理解的东西。
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
答案 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*&) key
将key
投射到“引用void*
”,几乎意味着*(void**) &key
。这样做是为了假装key
实际上被定义为void*
。
注意:这通常被认为是非常糟糕的做法。 key
实际上更好地定义为void*
,然后调用GetKey
不需要强制转换。