【发布时间】:2011-05-25 09:15:31
【问题描述】:
我熟悉 Java,并尝试自学 C/C++。我正在从托管他们的材料here 的课程中窃取一些课程。很遗憾,因为我不在班上,所以我不能问老师。我关心的是“动态声明的数组”下的部分:
如果你 希望能够改变大小 你的数组在运行时,然后声明 动态数组。这些都是用 指针和 new 运算符。为了 指针基础知识,阅读指针 部分。
使用new分配内存,然后 您以相同的方式访问数组 你会是一个静态数组。例如,
int* arrayPtr = new int[10];为了 (int i = 0; i
内存图片与 静态数组,但您可以更改 如果你需要,尺寸。不要忘记你 必须先释放内存 分配新内存(或者你会 有内存泄漏)。
删除 [] 数组指针; // 这 [] 删除数组指针时需要 arrayPtr = 新的 int[50]; . . .
当您完全完成 数组,你必须删除它的内存:
删除 [] 数组指针;
动态多维数组是 以与 Java 类似的方式完成。你 将有指向指针的指针。为 例如,查看一个
我的理解是C中的数组只是对数组中第一个元素的内存地址的引用。
那么,int *pointerArray = new int[10]; 和 int array[10]; 有什么区别?
我做了一些测试,似乎表明它们做的事情完全相同。是网站错了还是我看错了?
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
// Initialize the pointer array
int *pointerArray = new int[10];
for (int i = 0; i < 10; i++){
pointerArray[i] = i;
}
// Initialize the regular array
int array[10];
for (int i = 0; i < 10; i++){
array[i]= i;
}
cout << *(pointerArray + 5) << endl;
cout << *(array + 5) << endl;
cout << pointerArray[5] << endl;
cout << array[5] << endl;
cout << pointerArray << endl;
cout << array << endl;
return 0;
}
输出:
5
5
5
5
0x8f94030
0xbfa6a37c
我已尝试按照网站上的说明“动态调整”指针数组的大小,但我的新(更大)指针数组最终被 0 填充,这不是很有用。
【问题讨论】:
-
@Ivan:为什么会出错?对指针
T*执行算术运算时,+ 5表示+ 5 * sizeof(T)。 -
@James T:如果可以的话,考虑使用
std::vector<int>,这样会容易得多。 -
引用的文字中提到了,但你还是忘了用
delete[] pointerArray释放你的记忆。 -
呃,这不是 C++,这是一种折磨。在 C++ 中,我们有用于动态数组的
vector类。有一种思想流派认为,教授 C++ 的目标是最大限度地增加学生之后可以犯的错误数量,只教他们做所有事情的最坏方法。由于您找到的材料遵循这一理念,因此如果您想学习 C++,您能做的最好的事情就是尖叫着逃跑。然后买一本关于 C++ 的书 -
我只是不明白为什么这些教程一心要破坏 C++ 的形象。在 C++ 中,有一个更好的
std::vector替代方案,但他们仍然在谈论使用new[]创建动态数组。