复杂数据类型4:指针与数组,其中讲了reinterpret_cast

#include <iostream>
using namespace std;

int main()
{
	const unsigned short ITEMS = 5;

	int intArray[ITEMS] = { 1, 2, 3, 4, 5 };
	char charArray[ITEMS] = { 'F', 'i', 's', 'h', 'C' };

	int *intPtr = intArray;    //数组的名字就是第一个字符的地址,所以这么写就行
	char *charPtr = charArray;

	cout << "整形数组输出:" << endl;
	for (int i = 0; i < ITEMS; i++)
	{
		cout << *intPtr << " at " << reinterpret_cast<unsigned long>(intPtr) << endl;  //这里的reinterpret_cast运算符是用来处理无关类型之间的转换,用处见https://fishc.com.cn/blog-9-958.html
		intPtr++;
	}

	cout << "字符型数组输出:" << endl;
	for (int i = 0; i < ITEMS; i++)
	{
		//cout << *charPtr << " at " << reinterpret_cast<unsigned long>(charPtr) << endl;
		cout << *charPtr << " at " << charPtr << endl;  //这里将reinterpret_cast运算符删除后就会发生错误,思考一下为什么会
		charPtr++;
	}
	return 0;
}

下面是讲为啥要用“reinterpret_cast”:

对于C++编译器而言,数组的名字同时有两层涵义,一是数组在内存的首地址,二就是数组名字。当我们的指令形如:cout<<数组名的时候,编译器就面临一个选择:人类到底是想输出数组内容呢?还是输出元素地址呢?

最后它根据概率统计,会自作聪明地认为我们大部分时候是想(从当前指针位置开始)输出数组的内容,而不是当前元素的地址。所以说,这纯粹是编译器为了秀自己AI而搞出来的小麻烦,是它太想模拟人类的思维习惯了。

因此,必须用一个强制转换格式符来明确告诉编译器,我这里需要输出的是当前元素的地址。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++中,四种类型的转换(有时也称为“cast”)用于处理不同数据类型的互相转换,它们各有特定的用途和使用场景。以下是这四种转换的简要说明以及它们在源代码中的基本实现: 1. **static_cast**:这是一种静态类型转换,用于明确且不涉及运行时类型的检查。它可以用于基本类型指针、引用和内置的enum之间直接的转换。源代码示例: ```cpp int i = 5; double d = static_cast<double>(i); ``` 2. **dynamic_cast**:用于运行时类型检查,主要用于对象之间的类型转换,特别是当基类指针或引用需要转换为派生类类型时。如果类型转换成功,返回指向或引用的对象;否则返回null(对非指针)。例如: ```cpp class Base { ... }; class Derived : public Base { ... }; Base* baseObj = new Derived(); Derived* derivedObj = dynamic_cast<Derived*>(baseObj); ``` 3. **const_cast**:用于修改对象的const属性,即使在常量表达式中也可以用于临时去除const限定。这通常用于函数参数传递或返回值,或者为了修改const成员。注意这是有风险的,因为它打破了const契约: ```cpp const int& constRef = getConstInt(); int& mutableInt = const_cast<int&>(constRef); ``` 4. **reinterpret_cast**:这是最强大但也是最危险的转换,它将一个对象的数据重新解释为另一种类型,无视数据原有的字节布局。通常用于底层内存操作,如指针类型间的转换。不建议用于正常类型转换,仅在必要时使用,例如: ```cpp void* rawMemory = ...; // 假设我们知道它是int数组 int* intPtr = reinterpret_cast<int*>(rawMemory); ``` 请注意,这些类型转换在编译时就会进行,因此源代码中的实现主要体现在编译器层面,而不是直接在源码文件中看到具体的转换操作。实际的转换操作在C++库内部由编译器优化器处理。在代码中,我们主要关注的是转换的语法和意图。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值