详解C++中令人头痛的&和*操作符
前几天参加了一场在线笔试,C++程序阅读占了很大一部分,在此之中印象最为深刻的就‘&’和‘*’这两个操作符的运用了,
想想刚开始接触C\C++时,被这两个符号弄晕过不少次,作为学好c++不可缺少的两个符号,的确是凌乱了不少小伙伴,便想在此好好解释、总结一番,以便今后学习至此的同胞们更加省时省力。
查阅了不少资料,关于’&’和’*’,我们分开来说
“*”的两大用处
- 声明指针
当你声明一个整型的时候,指针也是一个变量:
#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代表的是值,不是地址)
“&”的三种作用
- 取地址
//代码三
#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;
0&0=0;
1&0=0;
101&100=100;
这里一句话带过,很简单的一种二进制运算,对于大多数人来说,这种用法并不常见,不做过描述。(但是考试党必学。。。)
指针和引用机制是C++类比其他语言更强大并且必不可少的功能,明白了这俩符号,你就能很快明白这两种机制的精髓,相信此文一定对理解C++基础的你有不小的帮助。