您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
第10讲-复杂的数据类型04_指针和数组
发布时间:2021-05-12 17:53:09编辑:雪饮阅读()
指針、數據類型與强制類型轉換reinterpret_cast
指針和普通的數據類型一樣,在不同的系統位數以及不同的編譯器下占用字節大小都是不同的,那麽可以使用sizeof根據不同環境獲取其實際占用字節數。
reinterpret_cast 用于进行各种不同类型的指针之间、不同类型的引用之间以及指针和能容纳指针的整数类型之间的转换。转换时,执行的是逐个比特复制的操作。
一個實例如:
#include <iostream>
#include <string>
using namespace std;
int main()
{
const unsigned short ITEMS=6;
int intArray[ITEMS]={1,2,3,4,5,6};
char charArray[ITEMS]={'K','a','s','u','m','i'};
/*
64位系統指針大小也為64位即8個字節
但是也受不同的編譯器影響例如:gcc、c-free,vc6++等結果可能有所不同
*/
int *intPtr=intArray;
char *charPtr=charArray;
/*
不僅僅是指針,其它數據類型也有此影響
用sizeof可以根據實際環境查看實際占用大小
*/
std::cout<<"unsigned long int的長度:"<<sizeof(unsigned long int)<<"\n";
std::cout<<"unsigned long long的長度:"<<sizeof(unsigned long long)<<"\n";
std::cout<<"unsigned long的長度:"<<sizeof(unsigned long)<<"\n";
std::cout<<"int的長度:"<<sizeof(int)<<"\n";
std::cout<<"*intPtr的長度:"<<sizeof(*intPtr)<<"\n";
std::cout<<"(intPtr)的長度:"<<sizeof((intPtr))<<"\n";
std::cout<<"intPtr的長度:"<<sizeof(intPtr)<<"\n";
std::cout<<"整型數組輸出:"<<'\n';
for(int i=0;i<ITEMS;i++){
//*:這裏的*是取值
std::cout<< *intPtr << " at ";
/*
c++里面的强制类型转换
用法:reinterpret_cast<类型>(变量)
甲魚這裏以前寫的是轉向unsigned long,但是看它好像是在c-free中編譯運行的
我個人猜測應該是他慣用的vc6++遇到了類似錯誤:
main.cpp:38:53: error: cast from 'int*' to 'long unsigned int' loses precision [-fpermissive]
std::cout<< reinterpret_cast<unsigned long>(intPtr) <<'\n';
原因也同樣是因爲不同的編譯器對於每個類型實際占用大小有不同,這裏我嘗試g++進行編譯也是報錯,
然後在g++中編譯運行查看了一些intPtr占用大小為8,二unsigned long占用大小是4,那麽很明顯這樣轉換是因爲丟失精度導致的轉換失敗而報錯的。
*/
std::cout<< reinterpret_cast<unsigned long long>(intPtr) <<'\n';
intPtr++;
}
std::cout<<"字符型數組輸出:"<<'\n';
for(int i=0;i<ITEMS;i++){
//這裏原來的轉換目標類型也是unsigned long而不是現在的unsigned long long,原因同上
std::cout<< *charPtr << " at " << reinterpret_cast<unsigned long long>(charPtr) <<'\n';
charPtr++;
}
return 0;
}
編譯並運行結果如:
D:\cproject>g++ main.cpp -o m
D:\cproject>m.exe
unsigned long int的長度:4
unsigned long long的長度:8
unsigned long的長度:4
int的長度:4
*intPtr的長度:4
(intPtr)的長度:8
intPtr的長度:8
整型數組輸出:
1 at 6421984
2 at 6421988
3 at 6421992
4 at 6421996
5 at 6422000
6 at 6422004
字符型數組輸出:
K at 6421978
a at 6421979
s at 6421980
u at 6421981
m at 6421982
i at 6421983
用不同的指針類型做為參數實現函數重載
在前面曾經嘗試用普通類型的形參實現函數重載,實際上對於指針類型形參也可以實現函數的重載的。
實例如:
#include <iostream>
#include <string>
using namespace std;
void print(int *pBegin,int *pEnd)
{
while(pBegin!=pEnd)
{
std::cout<<*pBegin;
++pBegin;
}
}
void print(char *pBegin,char *pEnd)
{
while(pBegin!=pEnd)
{
std::cout<<*pBegin;
++pBegin;
}
}
int main()
{
int num[6]={0,1,2,3,4,5};
char name[6]={'K','a','s','u','m','i'};
print(num,num+5);
std::cout<<'\n';
print(name,name+5);
std::cout<<'\n';
return 0;
}
編譯並運行結果如:
关键字词:指針,數組,强制類型轉換,類型轉換,reinterpret_cast