复杂数据类型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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值