指针/引用数组
Pointer/Refer to an array?
好的,我正在编写一个将在数组上执行不同功能的程序。如有必要,阵列将需要更改容量。说明是:
- 创建一个新阵列。
- 将内容从旧数组复制到新数组。
- 删除旧阵列。
这部分是可以理解的,但我不明白的是如何保留对函数将使用的数组的引用。这是我用于创建新数组并在元素上移动的代码。
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]
或类似。
根据您给出的代码,您当前执行的是:
- 创建新阵列 (
tempArray
) - 将旧数组(
arr
)数组的内容复制到新数组(temp
)-(注意-如果使新数组小于旧数组会发生什么? - 删除旧阵列
- 将新值复制回旧数组的已删除残餘部分(注意 - 您删除了
arr
所以您现在不能使用它! - 删除新阵列(这样一切都消失了)
基本上,您需要修复步骤2,以处理大小,并完全摆脱步骤4和5 - 您只需要重新分配arr
: arr = tempArray
你只需要声明数组 arr 并将值放入其中。您可以通过其指针 arr 或每个元素使用 arr[element_id] 引用数组。
这里有几个选项:
-
采用 C 样式的方法,只存储指向第一个元素的指针,就像您一样,再加上长度。从这两个中,您可以计算出所需的任何内容。
-
使用 std::vector。它包含一个数组,允许您使用
emplace_back
等函数轻松调整其大小,并可以使用size
函数告诉您其长度。
第二种方法当然是首选。如果你在C++,你通常应该使用std::vector
而不是原始数组,除非你正在寻找一个固定大小的数组。在这种情况下,请使用 std::array。
您还可以获得复制矢量的额外好处,就像vector1 = vector2;
一样简单。
- 通过指针与数组引用扩展数组索引序列
- 将链表的内容放在数组引用中
- 是否允许使用初始值设定项列表将const数组引用实例化为构造函数参数
- C 在将数组引用分配给struct时麻烦
- Typedef数组引用
- 通过强制转换创建子数组引用
- 将数组引用 'T(&)[n]' 引用到 'std::array<T, n>' 的内容
- constexpr 数组引用参数
- 寻找有关函数定义和原型中数组引用的说明
- Initializer_list作为非模板上下文中数组引用参数的参数
- 如何使用一个动态创建的一维数组的二维数组引用仅与标准库?
- 如何返回具有大小的POD数组引用
- 在C++中返回数组引用的语法
- 是否可以声明转换函数返回数组引用而不使用typedef
- 自定义到数组引用的转换
- 类数组引用的NullReferenceException
- 数组指针与数组引用之间的差异
- 在c++中传递数组引用
- 使用特征矩阵作为特征数组引用的参数
- 如何从函数传递数组引用