在C/C++中,我们经常能看到*和&符号出现,下面简单介绍一下这两个符号的常见用法,并通过一些示例来加深理解。
作为乘法运算符来使用,如a*b表示a和b两个变量相乘。
可用作代码块的注释说明。与//不同的,//用于一行代码的注释说明,类似于python中的#,而/* code block */用于一个代码块的注释说明,类似于python中的``` code block ```。
用作指针运算符。指针就是一个存放地址的变量 ,当指针指向某个变量时,这个指针里就存放了那个变量的地址。那为了表示指针所指向的变量的值,必须使用指针运算符*。
表示位运算符。
&&表示逻辑运算符“与”。
表示取内存地址。如&a表示取变量a的内存地址。
表示对变量的引用。如int &a = b,表示a是变量b的引用,可有简单地理解为b是变量a的别名,就好比如说我真名是张三,外号叫三儿,这个外号三儿就是真名张三的别名。
引用是C++对C的一个重要补充,有以下几点需要注意:
给个简单的C++程序:
#include<iostream>
using namespace std;
int main()
{
int a = 3;
int * b = &a;
cout << "a: " << a << endl;
cout << "&a: " << &a << endl;
cout << "b: " << b << endl;
cout << "*b: " << *b << endl;
*b =10;
cout << "a: " << a << endl;
cout << "&a: " << &a << endl;
cout << "b: " << b << endl;
cout << "*b: " << *b << endl;
}
其输出如下:
a: 3
&a: 0x4070f0
b: 0x4070f0
*b: 3
a: 10
&a: 0x4070f0
b: 0x4070f0
*b: 10
在这个示例中,我们先定义了整型变量a,并给其赋值为3。随后利用&符号取了变量a的内存地址,赋给了变量b,此时b就是一个指针,其类型是int 。所以a的值是3,&a表示的是变量a的内存地址为0x4070f0,指针b存储的是变量a的地址,也就是0x4070f0,b表示取指针b所对应的变量的值,也就是a的值,即3.
当修改b的值时候,因为指针b存储的就是变量a的内存地址,所以也就等价于修改了a的值,所以可以看到b =10操作后,a的值也发生了变化。
给个简单的C++程序:
#include<iostream>
using namespace std;
int main()
{
int a= 3;
int &b=a;
cout << "a: " << a << endl;
cout << "&a: " << &a << endl;
cout << "b: " << b << endl;
cout << "&b: " << &a << endl;
b =10;
cout << "a: " << a << endl;
cout << "&a: " << &a << endl;
cout << "b: " << b << endl;
cout << "&b: " << &a << endl;
}
其输出如下:
a: 3
&a: 0x4070f0
b: 3
&b: 0x4070f0
a: 10
&a: 0x4070f0
b: 10
&b: 0x4070f0
在这个示例中,我们先定义了整型变量a,并给其赋值为3。随后通过引用int &b = a将b作为a的别名。从输出中可以看到,a和b的值一致,且内存地址也是一样的。当我们修改b的值时,实际上等价于修改a的值。
给个简单的C++程序:
#include<iostream>
using namespace std;
void swap(int &a,int &b) //void swap(int a,int b),如果这样写则不能实现交换两个数的目的的。因为传递的方式为值传递(单向传递)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
int main(){
int a = 1;
int b = 2;
swap(a, b);
cout<< "a = " << a << endl;
cout<< "b = " << b << endl;
return 0;
}
其输出为:
a = 2
b = 1
C++中增加引用主要是作为函数参数,进行数据传递的功能。我们知道如果用变量名作为实参,其传递方向是单向的,而用引用作为实参其传递方向是双向的,即既能将实参的值传递给形参,也能将形参的值传递给实参。
在本例中,我们在swap函数中使用引用,故在main函数中调用swap函数时只需要传入变量名即可。但其实用引用完成的工作,用指针也能完成。但引用比指针的使用直观、方便,直截了当,不必“兜圈子”,容易理解。下面给出如果使用指针,如何写这个程序:
#include<iostream>
using namespace std;
void swap(int * a,int * b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
int main(){
int a = 1;
int b = 2;
swap(&a, &b);
cout<< "a = " << a << endl;
cout<< "b = " << b << endl;
return 0;
}
该程序输出与上面使用引用相同。
参考: https://www.cnblogs.com/wxl845235800/p/7449202.html https://www.bilibili.com/read/cv6763616 https://blog.csdn.net/xiaojinger_123/article/details/120453429