【超详细】*和&在C/C++中的常见用法(附示例讲解)
在C/C++中,我们经常能看到*和&符号出现,下面简单介绍一下这两个符号的常见用法,并通过一些示例来加深理解。
*符号的用法
用法一
作为乘法运算符来使用,如a*b表示a和b两个变量相乘。
用法二
可用作代码块的注释说明。与//不同的,//用于一行代码的注释说明,类似于python中的#,而/* code block */用于一个代码块的注释说明,类似于python中的``` code block ```。
用法三(重点)
用作指针运算符。指针就是一个存放地址的变量 ,当指针指向某个变量时,这个指针里就存放了那个变量的地址。那为了表示指针所指向的变量的值,必须使用指针运算符*。
&符号的用法
用法一
表示位运算符。
用法二
&&表示逻辑运算符“与”。
用法三
表示取内存地址。如&a表示取变量a的内存地址。
用法四
表示对变量的引用。如int &a = b,表示a是变量b的引用,可有简单地理解为b是变量a的别名,就好比如说我真名是张三,外号叫三儿,这个外号三儿就是真名张三的别名。
引用是C++对C的一个重要补充,有以下几点需要注意:
- • 声明引用时必须指定它代表的是哪一个变量,即对它初始化。
- • 引用与其所代表的变量共享同一内存单元,系统并不为引用另外分配存储单元。
- • 怎样区分&是引用还是取地址符呢?方法是:判断&a这样的形式前是否有类型符即int &a=b;如果有类型符(int)则是引用,否则是取地址运算符。
- • 对引用的初始化,可以是一个变量名,也可以是另一个引用。
示例1
给个简单的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的值也发生了变化。
示例2
给个简单的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的值。
示例3
给个简单的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
相关文章
- C++学习——c++逗号操作符说明(附加全部运算符优先级)
- c++语言截取字符串,详解C++ string常用截取字符串方法
- C++QT常见面试题[通俗易懂]
- c++获取子类窗口句柄位置_C++中各种获取窗口句柄的方法「建议收藏」
- C++模版笔记(2)
- C++构造函数的作用_c++什么是构造函数
- 【C++408考研必备】模板函数、内存分配、标准模板
- C++ 数学与算法系列之认识格雷码
- C/C++ 反汇编:分析类的实现原理
- C/C++ Npcap包实现ARP欺骗
- C/C++ 进程隐藏&加载寄生&僵尸进程
- C/C++开发基础——函数指针&回调函数
- 如何用Swift重写C++/ObjC代码库,并将其缩减70%
- C++知识点
- 【C++】模板初阶&&STL简介
- 【C++】哈希的应用 -- 位图
- C++字符串和数字转换完全攻略
- C++ vector容量和大小
- C++ inner_product内积计算方法详解
- C++ STL array容器和普通数组的比较
- AMP与Oracle结合提升数据库性能($amp oracle)
- C++多字节字符与宽字节字符相互转换
- C++中dynamic_cast<>的使用方法小结
- c++大数阶乘的实现方法
- 用c++实现将文本每个单词首字母转换为大写
- C++实现广度优先搜索实例
- Lua教程(六):绑定一个简单的C++类