将指针转换为引用指针

时间:2016-06-26 12:30:43

标签: c++ c++11

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

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

我需要演员吗? 为什么我需要施放,因为它是无效的??

限制:没有模板。

调用这样的代码:

unsigned int* a;
double* b;

SWAP_POINTERS(a,b);

2 个答案:

答案 0 :(得分:4)

<强> 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 :)

请注意,这并不能解决使用最少代码(无关)指针的交换(可能是有意的)。它只是解释为什么原始代码void*&在传递int*时不起作用,以及如何调用原始函数以便能够操作(在其函数上)参数...)。

第3。通过std::swap

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

答案 1 :(得分:0)

这会做你想要的,但完全不推荐。模板(或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)))

现在这个&#34;工作&#34;在某种程度上,它编译并做你想要的。我不知道你如何使用交换指针,当然......

unsigned int* a;
double* b;

SWAP_POINTERS(a,b);