gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:43:13 24 4
gpt4 key购买 nike

我正在尝试理解某段代码,但我发现有些代码对我来说有些难以理解。

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

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

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

这里的reference是用来将keyloc的变化值反射(reflect)给调用`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

最佳答案

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

你本来可以

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 实际上被定义为 void*

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

关于C++,参数类型(void*&)的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25563026/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com