当一次仅处理2个指针时,使多个指针指向同一位置的最简单方法

时间:2019-05-17 03:02:07

标签: c++ pointers

我想知道当您一次只能访问一对时,C ++中是否有一种方法可以使多个指针彼此相等。

void point_to_same_location(int*& pt1, int*& pt2) {
   // fucntion goes here
}
int* pt1;
int* pt2;
int* pt3;

point_to_same_loaction(pt1, pt2);
point_to_same_location(pt2, pt3);

我可以在函数主体中放入什么以便pt1 = pt2 = pt3

编辑:我正在寻找一种避免使用pt2 = pt1

的方法

2 个答案:

答案 0 :(得分:0)

如果您想避免使用pt1 = pt2;,可以像这样使用std::memcpy

#include <iostream>
#include <cstring>

void point_to_same_location(int*& pt1, int*& pt2) {
    std::memcpy(&pt1, &pt2, sizeof(pt1));
}

int main() {
    int* pt1;
    int* pt2;
    int* pt3;
    int a = 10;
    pt2 = &a;

    std::cout << pt2 << std::endl;
    point_to_same_location(pt1, pt2);
    std::cout << pt1 << std::endl;
    point_to_same_location(pt3, pt2);
    std::cout << pt3 << std::endl;
    return 0;
}

答案 1 :(得分:0)

我认为您想做的事很奇怪,但是无论如何。

请注意,创建指针时,应始终初始化指向nullptr的指针。这比让他们指向内存中的某个地方要安全得多。并且它可以让您检查指针是否已经分配。


如果要让两个指针指向相同的位置,则它们必须相等。因此,如果没有ptr1 = ptr2;,您就无法避免。

执行此操作的方法可能是:

bool point_to_the_same_location(int *& ptr1, int *& ptr2)
{
    if(ptr1 != ptr2)
    {
        if(ptr1 == nullptr) // try to affect ptr2 to ptr1
        {
            ptr1 = ptr2;
            return true; // success
        }
        if(ptr2 == nullptr) // try to affect ptr1 to ptr2
        {
            ptr2 = ptr1;
            return true; //success
        }

        // At this point both ptr1 and ptr2 != nullptr
        return false; // Both ptr1 and ptr2 are already pointing a different value, you need to release one of them.
    }
    else
        return true; // ptr1 already equals ptr2
}

如您所见,如果ptr1ptr2都已经指向了不同的值,则无法使它们指向相同的位置。如果这样做,将会丢失将要更改的值的先前值,并且会造成内存泄漏。
为避免这种情况,您可以说在影响新值之前先删除指针,但是如何知道您是否必须使用deletedelete []?实际上,从函数内部,您无法知道指针是指向单个值还是指向数组的第一个元素。因此,如果两个指针都已经指向某处,则不能使它们从函数内部指向同一位置。


另一件事,使用std::shared_ptr可能比使用原始指针完成您想做的事更好。

希望它能对您有所帮助。