指针
在C++,指针本质上也是一个对象
,它存储的是对象的地址
,而非值本身。是一个有趣且功能强大的特性。
指针的定义
指针的定义,使用"*"进行修饰一个变量。
int *p1,*p2
如上,定义了指针p1和p2,但并未给他们赋值。
指针的使用
指针使用时需要结合 取地址符“&”
或 直接指针间赋值
进行使用。
// 定义一个变量update
int update = 20;
// 使用取地址符获取update的地址存入*p_update中
int* p_update = &update;
// 把p_update赋值给pr
int* pr = p_update;
cout << "update:" << update;
cout << "p_update:" << p_update;
cout << "*p_update:" << *p_update;
// 使用指针进行运算
*p_update = *p_update + 1;
cout << "update:" << update;
输出结果
update:20
p_update:0x12434523452;
*p_update:20
更新之后
update:21
因为 p_update
指向的内存地址和 update
一样,而 &update
取出的时 update
内存中存储的值。
因此 p_update
和 update
完全等价。
创建时的注意事项
- 不同类型的变量,他们的值内部使用的格式不同,所以在什么指针时必须要指定指针指向的类型
- 创建指针时,对每个指针变量名都需要使用"*"
(int *p1, p2;语法创建的是一个指针p1和一个int类型的变量p2) - 指针变量不仅是指针,而是指向特定类型的指针
- 创建指针时,一定要在指针解引用运算符(*)之前,将指针初始化为一个确定的,适当的地址
- 可以使用new关键字创建指针
double * pd = new double;
*pd = 10000001.0;
使用new 创建的指针,如果内存不够时会抛出异常或返回0
指针回收
在C++中对象的创建都需进行回收操作,特别是指针使用不当就会导致内存泄漏。
指针的回收是结合delete关键字+指针名
例如:
int * ps = new int;
....
delete ps;
如上代码会释放ps指向的内存,但不会删除指针ps本身。还可以将ps重新指向另外一个新分配的内存块。在使用时,一定要使用new和delete配对使用,否则将发生内存泄漏;
【注】:
- 不要使用delete来释放不是new分配的内存
- 不要使用delete释放同一个内存块两次
- 如果使用new[]为数组分配内存,则应使用delete[]来释放。
- 如果使用new[]为一个实体分配内存,则应使用delete(没有方括号)来释放
- 对空指针应用delete是安全的
指针与常量
指针和常量集合时,就演变出了【指针常量】和【常量指针】这俩概念,其主要区分是看指针“*”修饰符和常量修饰符"const"谁在前面进行区分。
例如:
int simple = 20;
//常量指针
const int * a = &simple
//指针常量
int * const b = &simple
- 常量指针:能修改指向的对象地址,但修改对象的值。
- 指针常量:能修改对象的值,但无法修改对象地址。
如果修改常量指针的值或修改指针常量指向的地址时,编译器都会报错。
引用
引用可以理解为给变量起的一个别名,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。
int val = 1024;
int &refVal = val
总结
指针相当于变量,在创建时可以不用赋值,而引用相当于常量,在创建时必须赋值,且不能修改。指针指向的对象可以为空,而引用指向的对象不能为空。
引用比指针可能更加高效,因为不用考虑其有效性。使用指针时需要判断指针的有效性。
在c++中函数不能直接返回数组,可以返回一个指针指向数组,因为数组名就是一个指针。
参考:https://blog.csdn.net/zdc9023/article/details/126142503
标签:常量,int,update,C++,引用,new,delete,指针 From: https://www.cnblogs.com/ddqdd/p/17067913.html