#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而搞出来的小麻烦,是它太想模拟人类的思维习惯了。
因此,必须用一个强制转换格式符来明确告诉编译器,我这里需要输出的是当前元素的地址。