指针的释放
使用 new 得来的空间,必须用 delete 来释放;使用 new [] 得来的空间,必须用 delete [] 来释放。彼此之间不能混用。用 new [] 分配出连续空间后,指针变量“指向”该空间的首地址。
和指针变量相比, 数组没有一个单独的内存空间而存放其内存地址。即:指针变量p是一个独立的变量,只不过它的值指向另一段连续的内存空间;而数组arr,本身代表的就是一段连续空间。数组是“实”的地址,不能改变。当你和定义一个数组,则这个数组就得根据它在内存中的位置,得到一个地址,如上图中的“0x1A000000”。只要这个数组存在,那么它终生的地址就是这个值。指针是一个“虚”的地址,可以改变地址的值。
数组与指针的相似之处
通过+来得到指定元素,也可通过[]指定元素
int arr[20]; //定义arr[0] = 100; //让第一个元素为100for (int i = 1; i < 20; i++){ arr[i] = arr[i-1] + 50;}for (int i = 0; i < 20; i++) //输出{ cout << arr[i] << endl;}//通过+来得到指定元素,也可通过[]cout << *(arr + 0) << endl; //*(arr+0) 等于 *arrcout << *(arr + 1) << endl;cout << *(arr + 1) << endl;
int *p = new int[20]; //定义p[0] = 100; //让第一个元素为100for (int i = 1; i < 20; i++){ p[i] = p[i-1] + 50;}for (int i = 0; i < 20; i++) //输出{ cout << p[i] << endl;}//通过+来得到指定元素,也可通过[]cout << *(p + 0) << endl; //*(p+0) 等于 *pcout << *(p + 1) << endl;cout << *(p + 1) << endl;
//定义并初始化int arr[10] = {0,1,2,3,4,5,6,7,8,9}; //不能通过对数组本身+或-来改变数组的位置arr = arr + 1; //错!cout << *arr << endl;arr++; //错!cout << *arr << endl;arr--; //错!cout << *arr << endl;//数组所带的空间由系统自动分配及回收,无须也无法由程序来直接释放
//定义并且生成空间,但不能直接初始空间的内容int *p = new int[20] {0,1,2,3,4 ……}; // 错!//只得通过循环一个个设置for (int i=0; i<20; i++){ p[i] = i;}//可以通过+或-操作直接改变指针p = p + 1;cout << *p << endl;p++;cout << *p << endl; p--;cout << *p << endl;//指向连续空间的指针,必须使用delete[]来释放delete [] p;
int* p = new int[100]; int girl[100]; p = girl; delete [] p;
int *p = new int[3];*p = 1;cout << *p << endl;p++; //p的指向改变了,指向了下一元素*p = 2;cout << *p << endl;delete [] p; //错误的释放
p--;delete [] p;
int* p = new int[3];int* pbak = *p; //备份//移动 p……delete [] pbak; //释放
int* p = new int(71);cout << *p << endl; delete p; //OK!delete p; //ERROR! 重复删除p
int* p1 = new int(71);int* p2 = p1; //p2和p1 现在指向同一内存地址cout << *p1 << endl;cout << *p2 << endl;delete p1; //OKdelete p2; //ERROR! p2所指的内存,已通过delete p1而被释放,不可再delete一次
delete p2; //OKdelete p1; //ERROR
int a = 100;int* p = &a;delete p; //ERROR