指针/参考数组?

时间:2014-02-14 16:22:26

标签: c++ arrays

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

  1. 创建一个新数组。
  2. 将旧数组中的内容复制到新数组。
  3. 删除旧数组。
  4. 这部分是可以理解的,但我不明白的是如何保持对函数将使用的数组的引用。这是我创建新数组并移动元素的代码。

      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变量来引用数组?

7 个答案:

答案 0 :(得分:2)

在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()成员函数几乎总是更好。

答案 1 :(得分:1)

您的代码中有未定义的行为

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

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

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

答案 2 :(得分:0)

解除分配后,需要为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;

答案 3 :(得分:0)

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

糟糕。删除后不要访问。除非分配了新内容,否则不要删除。

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

的数组
int arr[100]

或类似。

答案 4 :(得分:0)

根据您提供的代码,您目前正在执行的是:

  1. 创建一个新数组(tempArray
  2. 将旧(arr)数组的内容复制到新的(temp) - (注意 - 如果使新数组小于旧数组会怎样?)
  3. 删除旧数组
  4. 将新值复制回旧数组的已删除遗骸中(注意 - 您删除了arr,因此您现在无法使用它!)
  5. 删除新阵列(所以一切都消失了)
  6. 基本上,您需要修复第2步,处理大小,完全摆脱步骤4和5 - 您只需重新分配arrarr = tempArray

答案 5 :(得分:0)

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

答案 6 :(得分:0)

你有几个选择:

  1. 采用C风格的方法,只需将指针存储到第一个元素,再加上长度。从这两个你可以计算出你需要的任何东西。

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

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

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