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

指针

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

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

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

引用

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

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

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

int main()
{   
	int num[] = {1,2,3,4,5};
	cout << sizeof(num);
	return 0;
}  

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

内存分配

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

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

//p在栈区 在堆区分配了一块int型空间
int *p = new int;   //尽量不使用 p++这种操作,p不是数组,是指向一个连续的内存空间,new运算符返回第一个元素的地址
delete p;
int *p = new int[5];
delete []p;    //[]释放整个数组
//数组定义的两种方式
int *num = new int[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、程序结束后由系统释放
  • 文字常量区
    常量字符串就存放在这里,程序结束由系统释放
  • 程序代码区
    存放函数体的二进制代码

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值