我熟悉Java并试图自学C/C++.我偷了从承载它们的材料类课程的一些在这里.不幸的是,我不能问老师,因为我不在课堂上.我关注的是"动态声明的数组"下的部分:
如果希望能够在运行时更改数组的大小,则声明动态数组.这些都是通过指针和new运算符完成的.有关指针的基础知识,请阅读指针部分.
使用new分配内存,然后以与静态数组相同的方式访问数组.例如,
int*arrayPtr = new int [10]; for(int i = 0; i <10; i ++){arrayPtr [i] = i; }
内存画面与静态数组相同,但如果需要,可以更改大小.不要忘记在分配新内存之前必须释放内存(否则会导致内存泄漏).
delete [] arrayPtr; //删除数组指针时需要[] arrayPtr = new int [50]; ...
完成数组后,必须删除其内存:
delete [] arrayPtr;
动态多维数组以与Java类似的方式完成.你将有指针指针.例如,请参阅a
我的理解是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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
5
5
5
5
0x8f94030
0xbfa6a37c
Run Code Online (Sandbox Code Playgroud)
我试图按照网站上的描述"动态地重新调整"我的指针数组的大小,但我的新(更大)指针数组最终填充0,这不是很有用.
evg*_*eny 16
int array[10];静态地声明数组大小,这意味着它是固定的 - 这是唯一的主要区别.它也可能被分配在函数的堆栈框架内,即在程序的堆栈中.你不必担心delete []在那种阵列上使用,事实上,你可能会崩溃程序delete.
当你使用时operator new,你动态地分配内存,这可能会更慢,内存通常来自堆而不是程序的堆栈(虽然并不总是如此).在大多数情况下这是更好的,因为堆栈空间比堆空间更受限制.但是,delete[]当您不再需要时,必须注意内存泄漏和内容.
至于你的数组被零填充,你的课程材料没有说的是你必须这样做:
int *arr = new int[20]; // old array
//do magic here and decide that we need a bigger array
int *bigger = new int[50]; // allocate a bigger array
for (int i = 0; i < 20; i++) bigger[i] = arr[i]; // copy the elements from the old array into the new array
delete[] arr;
arr = bigger;
Run Code Online (Sandbox Code Playgroud)
该代码将数组扩展了arr30多个元素.请注意,您必须将旧数据复制到新数组中,否则它将不存在(在您的情况下,所有内容都变为0).
我的理解是C中的数组只是对数组中第一个元素的内存地址的引用.
那么,int*pointerArray = new int [10]之间的区别是什么?和int数组[10]; 如果有的话?
你提到的是在任何C/C++初学者中引起很多混淆的原因.
在C/C++中,数组对应的存储块足够大以容纳其所有元素.这与[]语法相关联,如示例所示:
int array[10];
Run Code Online (Sandbox Code Playgroud)
C/C++的一个特性是你可以通过使用指向其类型的指针来引用数组.因此,您可以写:
int* array_pointer = array;
Run Code Online (Sandbox Code Playgroud)
这与:
int* array_pointer = &array[0];
Run Code Online (Sandbox Code Playgroud)
并且这允许以通常的方式访问数组元素:array_pointer[3]但是你不能把它array当作指针,比如在它上面做指针算术(即数组++失败).
也就是说,你可以[]在不使用语法的情况下管理数组,只需通过使用malloc然后将它们与原始指针一起使用来分配数组.这就是C/C++的"美".
恢复:必须区分指针和它指向的内存(实际数组):
[]声明中的语法(即int array[10];)同时引用两个方面(它给出了一个指针和一个数组);
当声明一个指针变量(即int* p;)时,你只需得到指针;
在评估表达式(即,, int i = p[4];或array[4];)时,[]只是意味着解除引用指针.
除此之外,int *pointerArray = new int[10];和之间的唯一区别int array[10];是前者是动态分配的,后者是堆栈.