C++学习笔记之指针、引用、内存分配总结

2022-08-12 10:48:39

指针

指针是一个值为内存地址的变量,指针不要贸然移动,如果为初始化的话,指针取随机。

  • 对于指针特别危险的是不给指针赋值,他会给指针一个随机值,如果随机给
    指针一个操作系统的核心地址,对它修改后可能会产生大问题

  • void * 指针
    一种特殊的指针类型,可以存放任意对象地址,可以指向任意类型
    注意事项:
    1、void * 指针存放一个内存地址,地址指向的内容是什么类型不能确定
    2、void * 类型指针一般用来:拿来和别的指针比较、作为函数的输入和输出;赋值给另一个void*指针

引用

引用即为对象起了另外一个名字(引用即别名),引用必须要被初始化

  • 注意事项:
    1、引用并非对象,只是为一个已经存在的对象起的别名
    2、引用只能绑定在对象上,不能与字面值或某个表达式的计算结果绑定在一起 int &ref_value = 10 //错误,如果非要引用常量,则在int前加const,表示来自常量的引用
    3、引用必须初始化,所以使用引用之前不需要测试其有效性,因此使用引用可能会比使用指针效率高

推荐使用引用,指针需要验证对象有没有值,效率较低,而引用只是为对象起了一个别名

intmain(){int num[]={1,2,3,4,5};
	cout<<sizeof(num);return0;}

num是数组首地址
输出如下:
在这里插入图片描述

内存分配

动态分配内存

  • 使用new分配内存
    指针真正的用武之地:在运行阶段分配未命名的内存以存储值,在此情况下只能通过指针来访问内存

  • 使用delete释放内存
    1、与new配对使用
    2、不要释放已经释放的内存
    不要创建两个指向同一内存块的指针,有可能误删两次
    3、不能释放声明变量分配的内存

//p在栈区 在堆区分配了一块int型空间int*p=newint;//尽量不使用 p++这种操作,p不是数组,是指向一个连续的内存空间,new运算符返回第一个元素的地址delete p;
int*p=newint[5];delete[]p;//[]释放整个数组
//数组定义的两种方式int*num=newint[5];int nums[5]={1,2,3,4,5};//num此时其实是没有空间的,sizeof(num) = 4,sizeof(nums) = 20
  • 关于new和delete使用的规则
    1、不要使用delete释放不是new分配的内存
    2、不要使用delete释放同一内存两次
    3、如果使用new[]为数组分配内存,则对应delete[]释放内存

程序的内存分配

  • 栈区(stack)
    1、由编译器自动分配释放,一般存放函数的参数值、局部变量的值等
    2、操作方式类似数据结构中的栈-先进后出
  • 堆区(heap)
    1、一般由程序员分配释放,若程序员不释放,程序结束时可能由操作系统回收
    2、与数据结构里的堆是两回事,分配方式类似链表
  • 全局区(静态区-static)
    1、全局变量和静态变量的是存储在一起的
    2、程序结束后由系统释放
  • 文字常量区
    常量字符串就存放在这里,程序结束由系统释放
  • 程序代码区
    存放函数体的二进制代码

示例:
在这里插入图片描述

  • 作者:yyyyygq
  • 原文链接:https://blog.csdn.net/y18771025420/article/details/104436922
    更新时间:2022-08-12 10:48:39