交换周围的对象数组是否会影响指向它的指针



当交换或移动对象数组时,如果假设数组中有指针指向随机对象,会发生什么。指针是否跟随objects元素移动?如果他们不这样做,有没有办法让他们这样做?

对象不会移动。对象中的值可以移动(或交换或复制(到不同的对象中。

指针指向对象。如果这些对象的值发生了更改,指针将指向更改后的值。如果对象的生存期结束,指针将挂起。

当交换或移动对象数组时,如果假设数组中有指针指向randomn对象,会发生什么。指针是否跟随objects元素移动

指针将指向与以前相同的内存地址。如果更改数组中的值,则对指针没有影响。

如果他们不这样做,有办法让他们这样做吗

是的,有一种方法,你只需要让它们指向你想让它们指向的任何地方。

示例:

int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

int *ptr = &array[5]; // pointing to array[5]
printf("%dn", *ptr); // prints 6
array[5] = 20;        // changing the value if array[5]
printf("%dn", *ptr); // still pointing to array[5], prints 20
ptr = &array[2];      // now pointing to array[2]
printf("%dn", *ptr); // prints 3

当然,这必须应用于您所说的交换方法,您没有显示任何代码,因此我无法举例说明。

当对象在数组中移动时,有一些方法可以让指针跟随对象。最简单的方法是在数组中移动对象时简单地修改指针。

T arr[5];
T* ptr = &arr[3]; //point to the third element
std::swap(arr[1], arr[3]); //swap array element 1 with 3
ptr = &arr[1]; //update the pointer to point to element 1

我认为您所要求的是在不修改指针以指向对象新位置的情况下移动/交换对象。最简单的方法,也是您看到最多的方法,是在堆上分配一个指向对象的指针数组(这里使用std::shared_ptr实现(。

std::shared_ptr<T> arr[5]; //array of 5 shared_ptr<T>
arr[0] = new T();
arr[1] = new T();
arr[2] = new T();
arr[3] = new T();
arr[4] = new T();
T* ptr = &*arr[3]; //point to the third element
std::swap(arr[1], arr[3]); //swap array element 1 with 3
//no need to update the pointer

这是因为shared_ptr在堆上分配T(参见new operator(,所以交换arr[1]arr[3]意味着ptr仍然指向相同的T。注意未编译或测试的代码。

注意,这适用于任何可修改的连续或非连续数据存储,例如std::vector<T>,而不是数组。

最新更新