微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决交换对象数组是否会影响指向它的指针

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

解决方法

物体不动。对象中保存的值可以移动(或交换或复制)到不同的对象中。

指针指向对象。如果这些对象的值发生更改,则指针指向更改后的值。如果对象的生命周期结束,则指针悬垂。

,

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

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

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

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

示例:

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 而不是数组。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。