将指针强制转换为引用指针

Cast pointer to reference pointer

本文关键字:指针 引用 转换      更新时间:2023-10-16

在下面的代码中,我将指针类型转换为引用指针类型,以便将指针更改为指向其他地方:

inline void SWAP_POINTERS(void*& p1,void*& p2)
{
    void* temp = p1;
    p1 = p2;
    p2 = temp;
}

当我调用函数时,我得到以下错误:

note: candidate function not viable: no known conversion from 'int32_t *' (aka 'int *') to 'void *&' for 1st argument

我需要强制转换吗?为什么我需要cast,因为它是无效的*?

限制:没有模板。

这样调用代码:

unsigned int* a;
double* b;
SWAP_POINTERS(a,b);

1。当你在交换指针后解引用其中一个指针时,你可能会破坏严格混叠。

unsigned int* a;
double* b;
SWAP_POINTERS(a,b);
但是,不要交换不指向同一类型的指针。(注意,char别名其他类型,但这是一个例外。)

2。

不能将int*隐式转换为void*&

int*可以隐式地转换为void*,但是这种转换会创建一个不能绑定到左值引用的右值。

为了将SWAP_POINTERS与问题中显示的签名一起使用,必须首先创建void*类型的左值,并将其传递给SWAP_POINTERS

的例子:

int a{0}, b{1};
int * pa = &a;
void * vpa = pa;
int * pb = &b;
void * vpb = pb;
SWAP_POINTERS(vpa, vpb); // swaps vpa and vpb - OF COURSE :)

请注意,这并不能用最少的代码解决(可能是有意的)(不相关的)指针的交换。它只是解释了为什么在传递int*时,void*&的原始代码不能工作,以及对原始函数的调用必须如何才能进行操作(对其函数参数…)。

3。通过std::swap

交换指针
int a{0}, b{1};
int * pa = &a;
int * pb = &b;
std::swap(pa, pb);

这将做你认为你想要的,但完全不推荐。模板(或std::swap)确实是正确的答案。

首先,定义一个内联函数来接受void **
inline void SWAP_POINTERS2(void** p1,void** p2)
{
    void* temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}

然后,定义一个宏来执行不愉快的强制转换。

#define SWAP_POINTERS(a,b) SWAP_POINTERS2((void **) &a, (void **) &b)

或者,如果您喜欢使用static_cast:

  #define SWAP_POINTERS(a,b) SWAP_POINTERS2(static_cast<void**>(static_cast<void *> (&a)), static_cast<void**>(static_cast<void *>(&b)))

现在,它"工作"的程度,它编译和做你想要的。当然,我不知道如何使用交换后的指针…

unsigned int* a;
double* b;
SWAP_POINTERS(a,b);