首页 > 编程语言 >C++中的指针和引用

C++中的指针和引用

时间:2023-01-26 16:44:27浏览次数:57  
标签:常量 int update C++ 引用 new delete 指针

指针

在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

总结

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

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

标签:常量,int,update,C++,引用,new,delete,指针
From: https://www.cnblogs.com/ddqdd/p/17067913.html

相关文章

  • C/C++程序是怎么运行的?
    一个C/C++程序运行经历的过程:预处理、编译、汇编、链接、执行。【注】其中源程序、修改了的源程序和汇编程序都是文本文件,而可重定位目标程序和可执行目标程序都是二进制......
  • c++ 数组
              ......
  • 力扣只出现一次的数字系列总结(C++)
    tags:LeetCodeC++DSA写在前面最近用到的异或运算越来越多了,而其中又以只出现一次的数字为经典题型,下面总结总结一下只出现一次的数字系列.代码均为C++.前置知识逻辑......
  • C++语言课程设计任务书[2023-01-26]
    C++语言课程设计任务书[2023-01-26]课程设计要求及评分标准:一、教学目标和基本要求本课程全面系统的学习面向对象程序设计的基本概念,基本语法和编程方法。正确理解掌握C......
  • C/C++歌曲信息管理系统[2023-01-26]
    C/C++歌曲信息管理系统[2023-01-26]任务描述(1)设计一个对歌曲信息进行查询、编辑、添加、删除等操作的管理程序。(2)歌曲信息包括歌曲名、词作者、曲作者、演唱者、发......
  • C/C++仲恺农业工程学院计算机系图书管理系统
    C/C++仲恺农业工程学院计算机系图书管理系统对仲恺农业工程学院计算机系的图书进行管理,包括录入、删除、查找、修改、排序等功能。图书应该包括类别、编号、ISBN号、作者......
  • C++《面向对象程序设计》[2023-01-26]
    C++《面向对象程序设计》[2023-01-26]课程设计报告课程名称面向对象程序设计课题名称专业班级学号姓名指导教师2022年12月26日......
  • C++一卡通管理系统[2023-01-26]
    C++一卡通管理系统[2023-01-26]编程题题1:采用面向对象的程序设计方法编写一个一卡通管理系统,要求使用多继承、虚函数、虚基类,要有设定类别、计算消费额等功能。题2......
  • 【C++ OOP 01】封装
    封装封装的意义封装是C++面向对象三大特性之一封装的意义:将属性和行为作为一个整体,表现生活中的事物将属性和行为加以权限控制封装意义一​ 在设计类的时候,属性和......
  • C/C++校友管理系统[2023-01-26]
    C/C++校友管理系统[2023-01-26]问题描述设计一个数智学院校友管理系统,设置管理员、校友两个角色。实现校友注册与管理、学校新闻发布与查看,问卷调查功能。基本功能要求:......