常量指针
const关键字声明一个常量,常量声明后不能修改。类似的,我们可以声明常量指针:double radius = 5;
double * const pvalue = &radius;
*pvalue = 4//可以修改
其中pvalue是一个常量指针,其声明和初始化必须在同一条语句中,后面的程序不能为其赋予新的地址。注意,虽然pvalue是常量,但pvalue指向的数据不是常量,是可以修改指的。
指针常量
可以声明一个指针,指向常量数据吗?完全可以,只要将关键字放于数据类型之前即可
const double * const pvalue = &radius;
上例中,指针是常量的,指针指向的数据也是常量的;
如果声明指针为
const double* pvalue = &radius;
则指针不是常量的,但指针指向的数据是常量
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<map>;
using namespace std;
int dp[1000][1000];
int main(){
double radius = 5;
double * const pvalue = &radius;
double length = 5;
*pvalue = 6;//ok
pvalue = &length;//wrong,指针是常量
const double * pvalue1 = &radius;
radius = 7;//yes,只是不能通过指针修改值而已
*pvalue1 = 6;//wrong,指针指向常量数据
pvalue1 = &length;//ok
const double * const pvalue2 = &radius;
*pvalue2 = 6;//wrong
pvalue2 = &length;//wrong
return 0;
}
指针作为函数返回值
#include<iostream>
using namespace std;
int * reverse(const int * list, int size){
int result[10];//错误,函数里的局部变量分配在栈里,函数调用结束时,所有局部变量都被销毁
int * result = new int[size];//yes,new操作符分配的内存空间在堆里,只有显式地释放或者程序终止
for(int i = 0, j = size - 1; i < size; i++, j --){
result[i] = list[j];
}
return result;
}
int main(){
int list[] = {1,2,3,4,5,6};
list * plist = reverse(list, 6);
return0;
}
显式地释放new操作符分配的内存空间,要用delete关键字
delete[]list;
内存泄漏
在释放一个指针指向的内存空间之前,你可能无意中为它赋予了新的地址:
int * pvalue = new int;
*pvalue = 45;
pvalue = new int;
保存45的原内存空间将无法再访问,因为已经没有任何指针指向它,这段内存无法访问也无法释放,就是所谓的内存泄漏