详解C++中令人头痛的&和*操作符

详解C++中令人头痛的&和*操作符


前几天参加了一场在线笔试,C++程序阅读占了很大一部分,在此之中印象最为深刻的就‘&’和‘*’这两个操作符的运用了,
想想刚开始接触C\C++时,被这两个符号弄晕过不少次,作为学好c++不可缺少的两个符号,的确是凌乱了不少小伙伴,便想在此好好解释、总结一番,以便今后学习至此的同胞们更加省时省力。

查阅了不少资料,关于’&’和’*’,我们分开来说

“*”的两大用处

  1. 声明指针

当你声明一个整型的时候,指针也是一个变量:

#include <iostream>
using namespace std;
//代码一
int main(){
int *p;
return 0;
}

此处我们声明了一个指针p,它的类型是int*,别小看这个*对这句话意义的改变,倘若我们忽略这个*号:

//代码二
#include<iostream> using namespace std; int main(){ int p; return 0; }

从内存角度来考虑,代码二在栈中开辟了一块用于存储int变量的内存
然而代码一开辟了两块内存,一个是指针p的内存,还有一个是指针指向的int的内存
由此可知,*在此的作用是开辟两块空间,一块用来存指针,另一块用来存一个变量,该变量的类型定义在*之前,这样来理解的话,我们也能很迅速的掌握*的语法,能知道*是在哪里,是int* p而不是*int p了

2. 代表指针所指的地址所描述的内容:

//代码三
#include <iostream> using namespace std; int main(){ int *pa int a=3; pa=&a;//指向一个int值的地址 printf("%d",pa);//输出的是指针所在地址 printf("%d",*pa);//输出3 return 0; }

当我们成功的声明了一个指针p并为其赋值的时候,p就有了两层含义,既是一个变量,也是另一个变量的代表
,而*就起到了改变p含义的作用,p代表着指针本身的值,*p代表着指针所指的地址的值(注意:这里*p代表的是值,不是地址)

“&”的三种作用

  1. 取地址
//代码三
#include <iostream> using namespace std; int main(){ int *pa int a=3; pa=&a;//指向一个int值的地址 return 0; }

这是&在C++中最常用的含义了,也是最容易理解的含义,套用代码三我们发现,‘&’符号通常在指针赋值的时候出现,这是因为指针指向的是一个地址,并不是这块地址所代表的值,相信这里也有不初学者产生了误区吧。
2. 引用参数

//代码四
#include <iostream> using namespace std; int main(){ int a = 3; int& b = a; // b是a的引用,a,b是同一个变量 b = 4; // a也变化为4 int c = 2; b = c; // 是赋值给引用b,从而也改变了a的值,而不是把b作为c的引用 return 0; }

这个作用只在C++中表现,C语言中是没有的,变量的引用就相当于给一个变量取了一个别名,变量的原名不会变,和原名对应的内存地址也不会变,但是现在既可以通过原名改变地址对应的值,也可以用别名改,关键是有两个变量名,但是内存中只有一块与之对应的空间,这种用法更多的用处在函数中:

//代码五
#include <iostream> using namespace std; int test1(int a); int test2(int &a); int main(){ int a=2; printf("普通函数a=%d",test1(a));//输出2 printf("引用函数a=%d",test2(a));//输出3 return 0; } int test1(int a){ int b=3; a=b; } int test2(int &a){ int b=3; a=b; }

在test2中,函数的输入就是一个int类型的引用,我们都知道,方法中的局部变量会在方法结束时被销毁,所以,test1中的a的值在方法结束后不会被改变,而引用的变量在方法之外被申明的,所以并不参与这个销毁过程,所以值被改变了。除此之外,函数中引用变量,还可以减少对象拷贝对于内存的影响,也就是说输入的变量不会再开辟新的空间来保存,减少了内存消耗,相对于传入指针的函数而言,也减少了指针不安全性给程序带来的危害,看到这里小伙伴们一定要牢记’&’的这个作用,大大的用处!!!

  1. 位运算中的‘与’运算
    1&1=1;
    0&0=0;
    1&0=0;
    101&100=100;
    这里一句话带过,很简单的一种二进制运算,对于大多数人来说,这种用法并不常见,不做过描述。(但是考试党必学。。。)

指针和引用机制是C++类比其他语言更强大并且必不可少的功能,明白了这俩符号,你就能很快明白这两种机制的精髓,相信此文一定对理解C++基础的你有不小的帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值