指针/引用数组

Pointer/Refer to an array?

本文关键字:数组 引用 指针      更新时间:2023-10-16

好的,我正在编写一个将在数组上执行不同功能的程序。如有必要,阵列将需要更改容量。说明是:

  1. 创建一个新阵列。
  2. 将内容从旧数组复制到新数组。
  3. 删除旧阵列。

这部分是可以理解的,但我不明白的是如何保留对函数将使用的数组的引用。这是我用于创建新数组并在元素上移动的代码。

  int newSize = m_size*2;
  double *tempArray= new double[newSize];
  for(int i=0; i<m_size-1; i++)
  {
     tempArray[i] = arr[i];
  }
  delete []arr;
  for(int i=0; i<m_size-1; i++)
  {
     arr[i] = tempArray[i];
  }
  delete []tempArray;
 }

所有其他方法都使用 arr,所以我想参考一下。指针不起作用,因为它只指向第一个元素。如何使用我的 arr 变量来引用数组?

在 C 和C++中,动态数组通常由指向第一个元素的指针和元素的数量表示。所以我假设以下声明:

double *arr;
int m_size;

如果你arr被清除为一个真正的数组double arr[..],那么你就不能做delete []arr也不能改变它的大小!

然后,您的代码应如下所示:

int newSize = 2*m_size;
double *tempArray= new double[newSize];
for(int i=0; i<m_size-1; i++)
{
   tempArray[i] = arr[i];
}
delete []arr;
arr = tempArray;
m_size = newSize;

但现在我想知道:为什么m_size-1在循环中?

而且,您可以只做:

memcpy(tempArray, arr, sizeof(*arr) * m_size)); //or m_size-1?

如果这是一个练习,这一切都很好。对于真正的代码,使用 std::vector<double>resize() 成员函数几乎总是更好。

代码中有未定义的行为

delete []arr;
for(int i=0; i<m_size-1; i++)
{
   arr[i] = tempArray[i];
}

删除 arr 指向的内存,然后分配给循环内已删除的内存。相反,你应该只写:

delete []arr;
arr = tempArray;

整个代码将是:

int newSize = m_size*2;
double *tempArray= new double[newSize];
for(int i=0; i<m_size-1; i++) // -1 might be wrong, look below for a comment on this line.
{
   tempArray[i] = arr[i];
}
delete []arr;
arr = tempArray;
m_size = newSize // stolen from the others *cough* since I oversaw the need.
// note that I don't call delete on tempArray.
}

我也不知道你是如何分配你的第一个数组的,但如果你让它调用new double[m_size]那么你会想删除 for 循环循环条件中的-1,因为你正在检查i < m_size而不是i <= m_size

您需要在解除分配 ar 后为其分配内存。

int newSize = m_size*2;
double *tempArray= new double[newSize];
for(int i=0; i<m_size-1; i++)
{
   tempArray[i] = arr[i];
}
delete []arr;
ar = new double[newSize];
for(int i=0; i<m_size-1; i++)
{
   arr[i] = tempArray[i];
}
delete []tempArray;
delete []arr;
for(int i=0; i<m_size-1; i++)
{
 arr[i] = tempArray[i];
}

哎呀。删除后不要访问。并且不要删除,除非它分配了新的。

您根本无法重新分配声明为

int arr[100]

或类似。

根据您给出的代码,您当前执行的是:

  1. 创建新阵列 ( tempArray
  2. 将旧数组(arr)数组的内容复制到新数组(temp)-(注意-如果使新数组小于旧数组会发生什么?
  3. 删除旧阵列
  4. 将新值复制回旧数组的已删除残餘部分(注意 - 您删除了arr所以您现在不能使用它!
  5. 删除新阵列(这样一切都消失了)

基本上,您需要修复步骤2,以处理大小,并完全摆脱步骤4和5 - 您只需要重新分配arrarr = tempArray

你只需要声明数组 arr 并将值放入其中。您可以通过其指针 arr 或每个元素使用 arr[element_id] 引用数组。

这里有几个选项:

  1. 采用 C 样式的方法,只存储指向第一个元素的指针,就像您一样,再加上长度。从这两个中,您可以计算出所需的任何内容。

  2. 使用 std::vector。它包含一个数组,允许您使用emplace_back等函数轻松调整其大小,并可以使用size函数告诉您其长度。

第二种方法当然是首选。如果你在C++,你通常应该使用std::vector而不是原始数组,除非你正在寻找一个固定大小的数组。在这种情况下,请使用 std::array。

您还可以获得复制矢量的额外好处,就像vector1 = vector2;一样简单。