将指针强制转换为引用指针
Cast pointer to reference pointer
在下面的代码中,我将指针类型转换为引用指针类型,以便将指针更改为指向其他地方:
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);
相关文章:
- 如何使用基类指针引用派生类成员
- 将常量指针引用绑定到非常量指针
- 如果非动态变量被指针引用,何时超出范围?
- 转换指针引用的字符串
- 指针引用的生存期(以 C++为单位)
- 从 unique_ptr::get 发送指针作为指针引用进入函数
- 指针/引用的 CLion 格式
- 使用模板专用化来比较指针引用
- 如何保存指向抽象基类的指针/引用,但在 c++ 中仍然可以复制
- C++初始化指针/引用/复制细微差别
- 用数组或指针引用函数?
- 指针范围问题和返回类中封装的指针向量内的指针引用
- 强制转换为指针引用是否会导致未定义的行为
- 访问由 void 指针引用的结构的成员
- C 为什么当先前的步骤引发异常时,std :: shared_ptr的指针引用会被破坏
- 动态指针引用数组由三元运算符返回值,但有异常
- 悬空指向 int 和 char* 常量的指针/引用
- C++ 二维数组和指针引用
- 通过使用指针/引用,在C++中使用向量加快计算速度
- C++非类型模板模板到函数指针/引用