C++中的指针和引用

指针

在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_updateupdate 完全等价。

创建时的注意事项

  • 不同类型的变量,他们的值内部使用的格式不同,所以在什么指针时必须要指定指针指向的类型
  • 创建指针时,对每个指针变量名都需要使用"*"
    (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

引用&和取值运算符&

https://blog.csdn.net/qq_26501341/article/details/58192662

#include <iostream>
 
using namespace std;
 
int main()
{
    int a = 88;
    int &c = a;  //声明变量a的一个引用c,c是变量a的一个别名,如果引用,声明的时候一定要初始化
    int &d = a;  //引用声明的时候一定要初始化,一个变量可以有多个引用
    
    cout<<"a="<<a<<endl;
    cout<<"c="<<c<<endl;
    cout<<"====================="<<endl;
    c=99;
    cout<<"a="<<a<<endl;
 
    return 0;
}

&(引用)==>用来传值,出现在变量声明语句中位于变量 左边时,表示声明的是引用。

&(取地址运算符)==>用来获取首地址,在给变量赋初值时出现在等号右边在执行语句中作为一元运算符出现时表示取对象的地址。

总而言之,和类型在一起的是引用,和变量在一起的是取址
用一句话归纳为就是:指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名,引用不改变指向。

总结

指针相当于变量,在创建时可以不用赋值,而引用相当于常量,在创建时必须赋值,且不能修改。指针指向的对象可以为空,而引用指向的对象不能为空。
引用比指针可能更加高效,因为不用考虑其有效性。使用指针时需要判断指针的有效性。
在c++中函数不能直接返回数组,可以返回一个指针指向数组,因为数组名就是一个指针。

参考
https://blog.csdn.net/zdc9023/article/details/126142503
https://blog.csdn.net/qq_26501341/article/details/58192662

原文链接: https://www.cnblogs.com/ddqdd/p/17067913.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++中的指针和引用

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/314067

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月16日 下午1:09
下一篇 2023年2月16日 下午1:09

相关推荐