C++:指针微探(指针(*)、取地址(&)、解引用(*)与引用(&)的区别)

1:初步了解指针与取地址的 语法

#include<stdio.h>
 
int main(void)
{
	int num = 7;

	int *p = &num;//初始化指针,也可以写作int* p = &num;

	printf("%d 的地址是 %p\n", num, p);

	return 0;
}

打印的结果就是 : 7 的地址是 000000B3FBEFF214

结论:
   上面int *p定义了一个指向int类型指针p(我们使用*符号把p声明为指针),
   并初始化p使其指向int类型的变量num,这里&num中的&是取地址操作符,当&作用于一个对象上时,
   它返回了该对象的地址。

    所以 *p这个指针就指向了:对象num的地址

2. 如何使用指针?——解引用与指针赋值

2.1 :指针解引用

*操作符为解引用操作符,它返回指针p所指的对象(左值)。

我们可以对*p赋值(对左值赋值),从而改变p所指的地址上所保存的值。

看代码

#include<stdio.h>
 
int main(void)
{
	int num = 7;
	int *p = &num;
	printf("数值%d所在的地址是 %p\n", num, p);
	printf("指针p所指向的地址为 %p , 该地址上所保存的值为%d\n", p, *p);

	*p = 100;
	printf("指针p所指向的地址为 %p , 该地址上所保存的值为%d\n", p, num);
	return 0;
}


打印结果:
  数值7所在的地址是 000000731EEFEEC4
  指针p所指向的地址为 000000731EEFEEC4 , 该地址上所保存的值为7
  指针p所指向的地址为 000000731EEFEEC4 , 该地址上所保存的值为100

结论
   1:*操作符为解引用操作符,它返回指针p所指的对象(左值)。
      所以我们可以对*p赋值(对左值赋值),从而改变p所指的地址上所保存的值。
   2:p 它返回 指针所指对象的地址。

   3:&p 就是 此指针变量自身的内存地址

所以指针变量和普通变量最重要的区别就是:
1 :指针变量p 保持的值(左值)就是 某个对象的内存地址,而普通变量num 就是保存的左值
2: 指针变量P 要获取 内存地址(左值)对应的 具体值,就需要通过 * 操作符来 解应用
3:同样 & 操作符 作用在  num 或者 p 变量上,都是获取这个变量的 自身内存地址
   

2.2 : 指针指向另外一个地址

我们也可以给指针p赋值,使其指向另外一个地址(这样就改变了在解引用时获取的左值):

#include<stdio.h>
 
int main(void)
{
	int num = 7, another = -5;
	int *p = &num;

    // 直接操作指针 p 让其指向另外一个对象 anther 地址
	p = &another;

	printf("%d\n", *p);//此时p指向了another,所以输出了another的值,即-5
	return 0;
}

3: 引用(引用概念在C++中才有,C中并没有)

3.1 :  引用必须初始化,使其绑定到一个变量上,修改引用的值,就是修改绑定的变量值

3.2 :引用一旦初始化(绑定到一个变量上),那么它将始终绑定到这个对象上,无法在绑定其他对象

3.3 :将引用B赋值给引用A,那么将改变引用A所绑定的变量值

#include<cstdio>
 
int main()
{
	int val = 7, val2 = 999;
    
    //引用必须要初始化,使其绑定到一个变量上
	int &refval = val, &refval2 = val2; 
	
    ///修改引用的值将改变其所绑定的变量的值
	refval = -12;
	printf("%d %d\n", val, refval);
	
	///将引用b赋值给引用a将改变引用a所绑定的变量的值,
	///引用一但初始化(绑定),将始终绑定到同一个特定对象上,无法绑定到另一个对象上
	refval = refval2;
	printf("%d %d\n", val, refval);
	return 0;
}


打印结果:

val的值-12 ,refval的值 -12
val的值999 ,refval的值 999

4: 指针和引用的区别

在传参的时候,使用指针传参,编译器需要给指针另行分配存储单元,存储一个该指针的副本,在函数中对这个副本进行操作;而使用引用传参,编译器就不需要分配存储空间和保存副本了,函数将直接对实参进行操作。所以使用引用使得程序的运行速度更快,执行效率更高。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值