指针 常量指针和指针常量

常量指针

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的原内存空间将无法再访问,因为已经没有任何指针指向它,这段内存无法访问也无法释放,就是所谓的内存泄漏


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值