问题描述
当交换或移动对象数组时,假设有指向数组中随机对象的指针会发生什么。指针是否跟随对象元素移动?如果他们不这样做,有没有办法让他们这样做?
解决方法
物体不动。对象中保存的值可以移动(或交换或复制)到不同的对象中。
指针指向对象。如果这些对象的值发生更改,则指针指向更改后的值。如果对象的生命周期结束,则指针悬垂。
,当交换或移动对象数组时,如果假设有指向数组中随机对象的指针会发生什么。指针是否跟随对象元素移动?
指针将指向与以前相同的内存地址。如果更改数组中的值,则对指针没有影响。
如果他们不这样做,有没有办法让他们这样做?
是的,有一种方法,你只需要让它们指向你想让它们指向的任何地方。
示例:
int array[] = {1,2,3,4,5,6,7,8,9,10};
int *ptr = &array[5]; // pointing to array[5]
printf("%d\n",*ptr); // prints 6
array[5] = 20; // changing the value if array[5]
printf("%d\n",*ptr); // still pointing to array[5],prints 20
ptr = &array[2]; // now pointing to array[2]
printf("%d\n",*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]
意味着 {{1} } 仍然指向同一个 ptr
。
注意代码未编译或测试。
请注意,这适用于任何可修改的连续或非连续数据存储,例如 T
而不是数组。