C++ note------引用

在理解C++中的引用之前,先理清一下变量,变量的本质为一块内存空间的地址以及空间中存放的数

据,而如果利用地址调用变量,稍显繁琐,所以一般都是给变量命名,调用时直接使用变量名即可,

那么,一个变量是否可以有多个名称呢?C++中的引用刚好能够做到。

#include <iostream>
using namespace std;
int main()
{
	int a = 10;
	int& b = a;
	cout << "a=" << a << endl;
	cout << "a.add=" << &a << endl;
	cout << "b=" << b << endl;
	cout << "b.add=" << &b << endl;
	return 0;
}

执行结果:
a=10
a.add=00AFFD98
b=10
b.add=00AFFD98

定义一个变量a,赋值为10,引用变量b,变量b与变量a代表的是同一块内存空间,并且输出打印a和b

的值与地址,得到的值都是相同的。而引用的本质,就是一个指针常量

理解引用之后,再看看引用所能实现的功能:

1、作为函数的参数

#include <iostream>
using namespace std;
//值传递
void mySwap01(int a,int b)
{
	int temp;
	temp = a;
	a = b;
	b = temp;
}
//址传递
void mySwap02(int* a, int* b)
{
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}
//引用传递
void mySwap03(int& a, int& b)
{
	int temp;
	temp = a;
	a = b;
	b = temp;
}
int main()
{
	int a = 10;
	int b = 20;
	mySwap01(a, b);
	cout << "mySwap01:" << endl;
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
	
	mySwap02(&a, &b);
	cout << "mySwap02:" << endl;
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
	
	mySwap03(a,b);
	cout << "mySwap03:" << endl;
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;

	return 0;
}

执行结果:
mySwap01:
a=10
b=20
mySwap02:
a=20
b=10
mySwap03:
a=10
b=20

写了三个交换函数,第一个是值传递,不改变(修饰)实参;第二个是址传递,改变(修饰)实参;

第三个是引用传递,改变(修饰)实参;所以第一个函数执行结果是a,b的值没有改变,第二个的结

果是a,b的值进行了交换,第三个的结果是a,b的值又交换回来了。

2、作为函数返回值

#include <iostream>
using namespace std;
//不要返回局部变量的引用
int& test01()
{
	int a = 10;//局部变量存放在栈区
	return a;
}
int main()
{
	int& ret1 = test01();
	cout << "ret=" << ret1 << endl;//第一次正确是编译器做了保留
	cout << "ret=" << ret1 << endl;//出现随机值,a的内存已经释放
}

执行结果
ret1=10
ret1=1375054224

首先在引用作为返回值时,需要注意的是,函数内部返回的如果是局部变量,返回的引用在输出时,

第一次能够正确是编译器做了保留,第二次是局部变量被释放,解决的办法就是在函数内,给需要返

回的变量初始化时加上static

#include <iostream>
using namespace std;
//函数引用可以作左值
int& test02()
{
	static int a = 10;//静态变量在程序结束后进行释放
	return a;
}
int main()
{
	int& ret2 = test02();
	cout << "ret2=" << ret2 << endl;
	cout << "ret2=" << ret2 << endl;
	test02() = 1000;
	cout << "ret2=" << ret2 << endl;
	cout << "ret2=" << ret2 << endl;
}
执行结果
ret2=10
ret2=10
ret2=1000
ret2=1000

返回类型为引用的函数可以作为左值,第一次输出时返回值为10,而第二次为1000,因为test02返回

的是a的引用,其实就相当于返回一个变量,所以可以作为左值,即相当于执行a=1000

#include <iostream>
using namespace std;

void fun1(int& a)
{
	cout << "a=" << a << endl;
}
void fun2(int& a)
{
	a = 100;
	cout << "a=" << a << endl;
}
int main()
{
	int a = 10;
	fun1(a);
	fun2(a);
	return 0;
}
执行结果
a=10
a=100

另外,为了防止误操作,可以在作为函数参数的引用前加上const,防止外部实参的引用传入函数中,

实参的值被修改。

void fun1(const int& a)
{
	cout << "a=" << a << endl;
}
<think>好的,用户想了解十六进制范围0x00到0x80在编程或数据表示中的相关信息。我需要先确认这个范围对应的十进制和二进制值,以及常见的应用场景。 首先,0x00到0x80的十六进制范围,转换成十进制是0到128。因为0x80是128。二进制的话,每个十六进制数字对应4位二进制,所以0x00是0000 0000,0x80是1000 0000。这里需要注意,0x80在8位二进制中最高位是1,可能代表符号位,但如果是无符号数的话,就是128。 接下来,考虑应用场景。ASCII码表里0x00到0x7F是标准字符,0x80可能属于扩展ASCII,但具体要看系统。比如在C语言中,char类型如果是无符号的,0x80是128,有符号的话就是-128。还有网络协议中的状态码,比如HTTP的128可能属于自定义范围。数据存储方面,8位字节的范围是0x00到0xFF,所以0x00到0x80可能用于特定场景,比如限制数值不超过128。 用户提供的引用中提到1个十六进制数字对应4位二进制,所以0x00到0x80的二进制是8位,即一个字节。另外,引用里的例子有十六进制和十进制的转换,比如0xC0FFEE,但用户的范围是0x00到0x80,可能需要解释不同进制的转换。 需要确认是否有特殊定义,比如在某些协议或文件格式中,这个范围是否有特定用途。例如,MIDI协议中的状态字节可能使用0x80到0xFF,而数据字节在0x00到0x7F,所以用户的范围可能涉及数据字节部分。 还要注意有符号和无符号的区别,比如在Java中byte类型是-128到127,所以0x80在这里是-128。这可能影响数值的处理方式。 总结需要涵盖转换、数据类型、应用实例,并引用提供的资料。例如,引用[1]说明十六进制和二进制的关系,引用[2]和[3]展示十六进制数的使用例子,可以结合这些引用来说明。</think>在编程和数据表示中,十六进制范围$0x00$到$0x80$具有明确的数值定义和应用场景: ### 1. 数值范围解析 - **十六进制转十进制**:$0x00 = 0D$,$0x80 = 128D$,对应十进制范围$[0,128]$ - **二进制表示**:每个十六进制数字对应4位二进制(如引用[1]所述),因此: - $0x00 → 0000\_0000B$(8位) - $0x80 → 1000\_0000B$(最高位为符号位时表示-128) ### 2. 技术应用场景 #### (1) 字符编码 - **ASCII扩展**:标准ASCII范围为$0x00$-$0x7F$(0-127D),$0x80$属于扩展ASCII字符集,具体定义取决于编码标准(如ISO-8859-1)[^1] #### (2) 数据类型定义 - **有符号字节**:在Java/C#中,`byte`类型范围为$-128D$($0x80$)到$127D$($0x7F$) - **无符号字节**:在Python/C++中使用`unsigned char`时,$0x80$表示$128D$ #### (3) 协议规范 - **网络协议**:HTTP状态码范围定义(如$0x00$-$0x80$可能表示自定义状态段) - **MIDI协议**:状态字节$0x80$表示"Note Off"事件[^2] #### (4) 数据存储 - **位掩码控制**:$0x80$(1000\_0000B)常用于检测最高位状态 - **颜色编码**:在16位RGB格式中,可能表示颜色通道的阈值 ### 3. 编程示例 ```python # 检测字节最高位 def check_sign(byte): return (byte & 0x80) != 0 # 0x80=10000000B print(check_sign(0x7F)) # 输出False print(check_sign(0x80)) # 输出True ``` ### 4. 范围验证表 | 十六进制 | 十进制 | 二进制 | 有符号值 | |----------|--------|-------------|----------| | 0x00 | 0 | 0000 0000 | 0 | | 0x7F | 127 | 0111 1111 | +127 | | 0x80 | 128 | **1000 0000** | -128 | [^1]: 引用自十六进制与二进制对应关系说明 : 参考MIDI协议规范文档
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值