【无标题】

C++中的指针和引用

1、指针

	指针也是变量,有自己的内存地址,内存数据中保存的值是另一个变量的地址。值所保存的是类型是内存地址, 所以值的内存占用只有一个字节(内存地址是一个16进制的数)。
	指针因为是一个变量,所以可以独立存在,可以单独申明,不进行初始化。
	int *p,
	int a = 2,
	p = &a,

2、引用

	引用是另一个变量的别名,依赖于一个变量实体而存在。而且在不能单独声明,必须在声明时,进行初始化,指定所引用的变量
	引用创建时, 不会在内存中开辟新的空间,引用和所引用的变量的内存地址和值(内存数据)完全一致。

示意图

3、指针传参

	指针传参:**不修改实参指针变量的值,只能修改实参指针所指向的内存数。** 函数定义时, 定义的指针类型形参,在实际函数调用时,传递实参指针变量的值给形参变量:也就是实参指针变量的值(是另一个变量的内存地址)传递给函数栈内的局部形参指针变量,函数的栈空间内为形参指针变量开辟内存空间,存放实参指针变量的值。在函数内部的操作,都是操作的实参指针变量所指向的另一个内存地址所指向的内存数据。函数外的实参指针变量的值保持不变,仍然是之前保存的那个变量的内存地址。

4、引用传参

引用传参: **传递实参引用的地址,函数内的对形参引用的操作直接修改函数外实参引用的值**。因为引用传参时按地址传递,函数调用时,函数的栈空间内为形参变量开辟内存空间,存放实参引用的地址。

5、引用传参和指针传参的区别:

1、引用按地址传递,指针按值传递。
2、函数执行时,编译器在栈区内存中为函数内的局部变量和形参变量分配内存空间,
编译器在栈区内存中为形参引用变量分配**内存地址空间**, 将实参引用的地址copy为形参引用变量在栈区的内存地址。
编译器在栈区内存中为形参指针变量分配**内存数据空间**, 将实参指针的值copy为形参指针变量在栈区内存中的值

引发的思考

1、按值传递和按引用传递时, 编译器在函数运行时,在栈区时如何操作内存的?
按值传递时: 编译器在栈区内存中为局部变量分配内存地址和内存数据空间
按指针传递也是按值传递,可以认为是一样的。
按引用传递:编译在栈区内存中为局部变量只分配内存地址空间,内存地址指向实参的内存数据空间。
ps: 提起栈区,需要注意的一点,函数运行时在战区内分配的内存数据空间,在函数出栈时,会被销毁,所以如果将函数体内创建的内存数据空间的地址作为返回值,暴漏给函数以为,那么函数执行结束后,就无法根据这个内存地址访问内存数据空间,因为栈区对应的内存数据空间在函数出栈时,已经被收回。

编译的角度

从编译的角度来讲,程序在编译时分别将指针和引用添加到符号表上,符号表中记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值(与实参名字不同,地址相同)。符号表生成之后就不会再改,因此指针可以改变其指向的对象(指针变量中的值可以改),而引用对象则不能修改。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值