VC數(shù)據(jù)類型詳解.doc_第1頁
VC數(shù)據(jù)類型詳解.doc_第2頁
VC數(shù)據(jù)類型詳解.doc_第3頁
VC數(shù)據(jù)類型詳解.doc_第4頁
VC數(shù)據(jù)類型詳解.doc_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

VC+常用數(shù)據(jù)類型及其操作詳解-西安郵電學(xué)院計算機系 徐兆元(FL FL)2004/08/03目錄一 VC常用數(shù)據(jù)類型列表二 常用數(shù)據(jù)類型轉(zhuǎn)化2.1數(shù)學(xué)類型變量與字符串相互轉(zhuǎn)換2.2 CString及string,char *與其他數(shù)據(jù)類型的轉(zhuǎn)換和操作CString,string,char*的綜合比較數(shù)學(xué)類型與CString相互轉(zhuǎn)化CString與char*相互轉(zhuǎn)換舉例CString 與 BSTR 型轉(zhuǎn)換VARIANT 型轉(zhuǎn)化成 CString 型2.3 BSTR、_bstr_t與CComBSTR2.4 VARIANT 、_variant_t 與 COleVariant附錄CString及字符串轉(zhuǎn)及操作詳解參考書籍:CSDN, 一VC常用數(shù)據(jù)類型列表TypeDefault SizeDescription基礎(chǔ)類型全是小寫說明:這些基礎(chǔ)數(shù)據(jù)類型對于MFC還是API都是被支持的booleanunsigned 8 bit ,取值TRUE/FALSEbyteunsigned 8 bit,整數(shù),輸出按字符輸出charunsigned 8 bit,字符doublesigned 64 bit浮點型floatsigned32 bit浮點型handle_tPrimitive handle typehypersigned 64 bit整型intsigned 32 bit整型longsigned 32 bit整型shortsigned 16 bit整型smallsigned 8 bit整型void *32-bit指向未知類型的指針wchar_tunsigned 16 bit16位字符,比char可容納更多的字符Win32API常用數(shù)據(jù)類 型全大寫說明: 這些Win32API支持的簡單數(shù)據(jù)類型主要是用來定義函數(shù)返回值,消息參數(shù),結(jié)構(gòu)成員。這類數(shù)據(jù)類型大致可以分為五大類:字符型、布爾型、整型、指針型和句柄型(?). 總共大概有100多種不同的類型, BOOL/BOOLEAN8bit,TRUE/FALSE布爾型BYTEunsigned 8 bitBSTRCComBSTR_bstr_t32 bitBSTR是指向字符串的32位指針是對BSTR的封裝是對BSTR的封裝CHAR8 bit(ANSI)字符類型COLORREF32 bitRGB顏色值 整型DWORDunsigned 32 bit整型FLOATfloat型float型HANDLEObject句柄HBITMAPbitmap句柄HBRUSHbrush句柄HCURSORcursor句柄HDC設(shè)備上下文句柄HFILEOpenFile打開的File句柄HFONTfont句柄HHOOKhook句柄HKEY注冊表鍵句柄HPENpen句柄HWNDwindow句柄INT-LONG-LONGLONG64位帶符號整型LPARAM32 bit 消息參數(shù)LPBOOLBOOL型指針LPBYTEBYTE型指針LPCOLOREFCOLORREF型指針LPCSTR/LPSTR/PCSTR指向8位(ANSI)字符串類型指針LPCWSTR/LPWSTR/PCWSTR指向16位Unicode字符串類型LPCTSTR/LPTSTR/PCTSTR指向一8位或16位字符串類型指針LPVOID指向一個未指定類型的32位指針LPDWORD指向一個DWORD型指針其他相似類型: LPHANDLE、LPINT、LPLONG、LPWORD、LPRESULTPBOOL、PBOOLEAN、PBYTE、PCHAR、PDWORD、PFLOAT、PHANDLE、PINT、PLONG、PSHORT說明:(1)在16位系統(tǒng)中 LP為16bit,P為8bit,在32位系統(tǒng)中都是32bit(此時等價)(2)LPCSTR等 中的C指Const,T表示TCHAR模式即可以工作在ANSI下也可UNICODESHORTusigned整型其他UCHAR、UINT、ULONG、ULONGLONG、USHORT為無符號相應(yīng)類型TBYTEWCHAR型或者CHAR型TCHARANSI與unicode均可VARIANT_variant_tCOleVariant一個結(jié)構(gòu)體參考OAIDL.H_variant_t是VARIANT的封裝類COleVariant也是VARIANT的封裝類WNDPROC指向一個窗口過程的32位指針WCHAR16位Unicode字符型WORD16位無符號整型WPARAM消息參數(shù)MFC獨有數(shù)據(jù)類型下面兩個數(shù)據(jù)類型是微軟基礎(chǔ)類庫中獨有的數(shù)據(jù)類型POSITION標記集合中一個元素的位置的值,被MFC中的集合類所使用LPCRECT指向一個RECT結(jié)構(gòu)體常量(不能修改)的32位指針CString 其實是MFC中的一個類說明:(1)-表示省略(2)1Byte=8Bit,字與機器有關(guān),在8位系統(tǒng)中:字=1字節(jié),16位系統(tǒng)中,1字=2字節(jié),32位中:1字=4字節(jié),64位中1字=8字節(jié).不要搞混這些概念.二常用數(shù)據(jù)類型轉(zhuǎn)化及操作21 數(shù)學(xué)類型變量與字符串相互轉(zhuǎn)換(這些函數(shù)都在STDLIB.H里)(1)將數(shù)學(xué)類型轉(zhuǎn)換為字符串可以用以下一些函數(shù):舉例: _CRTIMP char * _cdecl _itoa(int, char *, int);/這是一個將數(shù)字轉(zhuǎn)換為一個字符串類型的函數(shù),最后一個int表示轉(zhuǎn)換的進制如以下程序:int iTyep=3;char *szChar;itoa(iType,szChar,2);coutszChar;/輸出為1010類似函數(shù)列表:_CRTIMP char * _cdecl _itoa(int, char *, int);/為了完整性,也列在其中_CRTIMP char * _cdecl _ultoa(unsigned long, char *, int);_CRTIMP char * _cdecl _ltoa(long, char *, int);_CRTIMP char * _cdecl _i64toa(_int64, char *, int);_CRTIMP char * _cdecl _ui64toa(unsigned _int64, char *, int);_CRTIMP wchar_t * _cdecl _i64tow(_int64, wchar_t *, int);_CRTIMP wchar_t * _cdecl _ui64tow(unsigned _int64, wchar_t *, int);_CRTIMP wchar_t * _cdecl _itow (int, wchar_t *, int);/轉(zhuǎn)換為長字符串類型_CRTIMP wchar_t * _cdecl _ltow (long, wchar_t *, int);_CRTIMP wchar_t * _cdecl _ultow (unsigned long, wchar_t *, int);還有很多,請自行研究(2)將字符串類型轉(zhuǎn)換為數(shù)學(xué)類型變量可以用以下一些函數(shù):舉例: _CRTIMP int _cdecl atoi(const char *);/參數(shù)一看就很明了char *szChar=”88”;int temp(0);temp=atoi(szChar);couttemp;類似的函數(shù)列表:_CRTIMP int _cdecl atoi(const char *);_CRTIMP double _cdecl atof(const char *);_CRTIMP long _cdecl atol(const char *);_CRTIMP long double _cdecl _atold(const char *);_CRTIMP _int64 _cdecl _atoi64(const char *);_CRTIMP double _cdecl strtod(const char *, char *);/_CRTIMP long _cdecl strtol(const char *, char *, int);/_CRTIMP long double _cdecl _strtold(const char *, char *);_CRTIMP unsigned long _cdecl strtoul(const char *, char *, int);_CRTIMP double _cdecl wcstod(const wchar_t *, wchar_t *);/長字符串類型轉(zhuǎn)換為數(shù)學(xué)類型_CRTIMP long _cdecl wcstol(const wchar_t *, wchar_t *, int);_CRTIMP unsigned long _cdecl wcstoul(const wchar_t *, wchar_t *, int);_CRTIMP int _cdecl _wtoi(const wchar_t *);_CRTIMP long _cdecl _wtol(const wchar_t *);_CRTIMP _int64 _cdecl _wtoi64(const wchar_t *);還有很多,請自行研究22CString及string,char *與其他數(shù)據(jù)類型的轉(zhuǎn)換和操作(1)CString,string,char*的綜合比較(這部分CSDN上的作者joise的文章寫的很詳細,請大家在仔細閱讀他的文章.地址: /joise/或參考附錄:(2)轉(zhuǎn)換:數(shù)學(xué)類型與CString相互轉(zhuǎn)化 數(shù)學(xué)類型轉(zhuǎn)化為CString 可用Format函數(shù),舉例:CString s; int i = 64; s.Format(%d, i) CString轉(zhuǎn)換為數(shù)學(xué)類型:舉例CString strValue(1.234);double dblValue;dblValue = atof(LPCTSTR)strValue);CString與char*相互轉(zhuǎn)換舉例CString strValue(“Hello”);char *szValue;szValue=strValue.GetBuffer(szValue);也可用(LPSTR)(LPCTSTR)對CString/進行強制轉(zhuǎn)換.szValue=(LPSTR)(LPCTSTR)strValue;反過來可直接賦值:char *szChar=NULL;CString strValue;szChar=new char10;memset(szChar,0,10);strcpy(szChar,”Hello”);strValue=szChar;CString 與 BSTR 型轉(zhuǎn)換CString 型轉(zhuǎn)化成 BSTR 型當我們使用 ActiveX 控件編程時,經(jīng)常需要用到將某個值表示成 BSTR 類型.BSTR 是一種記數(shù)字符串,Intel平臺上的寬字符串(Unicode),并且可以包含嵌入的 NULL 字符??梢哉{(diào)用 CString 對象的 AllocSysString 方法將 CString 轉(zhuǎn)化成 BSTR:CString str;str = .; / whateverBSTR bStr = str.AllocSysString();BSTR型轉(zhuǎn)換為CString如果你在 UNICODE 模式下編譯代碼,你可以簡單地寫成:CString convert(BSTR bStr) if(bStr = NULL) return CString(_T(); CString s(bStr); / in UNICODE mode return s;如果是 ANSI 模式CString convert(BSTR b) CString s; if(b = NULL) return s; / empty for NULL BSTR#ifdef UNICODE s = b;#else LPSTR p = s.GetBuffer(SysStringLen(b) + 1); :WideCharToMultiByte(CP_ACP, / ANSI Code Page 0, / no flags b, / source widechar string -1, / assume NUL-terminated p, / target buffer SysStringLen(b)+1, / target buffer length NULL, / use system default char NULL); / dont care if default used s.ReleaseBuffer();#endif return s;VARIANT 型轉(zhuǎn)化成 CString 型VARIANT 類型經(jīng)常用來給 COM 對象傳遞參數(shù),或者接收從 COM 對象返回的值。你也能自己編寫返回 VARIANT 類型的方法,函數(shù)返回什么類型 依賴可能(并且常常)方法的輸入?yún)?shù)(比如,在自動化操作中,依賴與你調(diào)用哪個方法。IDispatch:Invoke 可能返回(通過其一個參數(shù))一個 包含有BYTE、WORD、float、double、date、BSTR 等等 VARIANT 類型的結(jié)果,(詳見 MSDN 上的 VARIANT 結(jié)構(gòu)的定義)。在下面的例子中,假設(shè) 類型是一個BSTR的變體,也就是說在串中的值是通過 bsrtVal 來引用,其優(yōu)點是在 ANSI 應(yīng)用中,有一個構(gòu)造函數(shù)會把 LPCWCHAR 引用的值轉(zhuǎn)換為一個 CString(見 BSTR-to-CString 部分)。在 Unicode 模式中,將成為標準的 CString 構(gòu)造函數(shù),參見對缺省:WideCharToMultiByte 轉(zhuǎn)換的告誡,以及你覺得是否可以接受(大多數(shù)情況下,你會滿意的)。VARIANT vaData;vaData = m_com.YourMethodHere();ASSERT(vaData.vt = VT_BSTR);CString strData(vaData.bstrVal);你還可以根據(jù) vt 域的不同來建立更通用的轉(zhuǎn)換例程。為此你可能會考慮:CString VariantToString(VARIANT * va) CString s; switch(va-vt) /* vt */ case VT_BSTR: return CString(vaData-bstrVal); case VT_BSTR | VT_BYREF: return CString(*vaData-pbstrVal); case VT_I4: s.Format(_T(%d), va-lVal); return s; case VT_I4 | VT_BYREF: s.Format(_T(%d), *va-plVal); case VT_R8: s.Format(_T(%f), va-dblVal); return s; . 剩下的類型轉(zhuǎn)換由讀者自己完成 default: ASSERT(FALSE); / unknown VARIANT type (this ASSERT is optional) return CString(); /* vt */23 BSTR、_bstr_t與CComBSTR CComBSTR、_bstr_t是對BSTR的封裝,BSTR是指向字符串的32位指針。 char *轉(zhuǎn)換到BSTR可以這樣: BSTR b=_com_util:ConvertStringToBSTR(數(shù)據(jù));/使用前需要加上頭文件comutil.h 反之可以使用char *p=_com_util:ConvertBSTRToString(b);24(引)VARIANT 、_variant_t 與 COleVariant VARIANT的結(jié)構(gòu)可以參考頭文件VC98IncludeOAIDL.H中關(guān)于結(jié)構(gòu)體tagVARIANT的定義。 對于VARIANT變量的賦值:首先給vt成員賦值,指明數(shù)據(jù)類型,再對聯(lián)合結(jié)構(gòu)中相同數(shù)據(jù)類型的變量賦值,舉個例子: VARIANT va; int a=2001; va.vt=VT_I4;/指明整型數(shù)據(jù) va.lVal=a; /賦值 對于不馬上賦值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);進行初始化,其本質(zhì)是將vt設(shè)置為VT_EMPTY,下表我們列舉vt與常用數(shù)據(jù)的對應(yīng)關(guān)系: unsigned char bVal; VT_UI1 short iVal; VT_I2 long lVal; VT_I4 float fltVal; VT_R4 double dblVal; VT_R8 VARIANT_BOOL boolVal; VT_BOOL SCODE scode; VT_ERROR CY cyVal; VT_CY DATE date; VT_DATE BSTR bstrVal; VT_BSTR IUnknown FAR* punkVal; VT_UNKNOWN IDispatch FAR* pdispVal; VT_DISPATCH SAFEARRAY FAR* parray; VT_ARRAY|* unsigned char FAR* pbVal; VT_BYREF|VT_UI1 short FAR* piVal; VT_BYREF|VT_I2 long FAR* plVal; VT_BYREF|VT_I4 float FAR* pfltVal; VT_BYREF|VT_R4 double FAR* pdblVal; VT_BYREF|VT_R8 VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOL SCODE FAR* pscode; VT_BYREF|VT_ERROR CY FAR* pcyVal; VT_BYREF|VT_CY DATE FAR* pdate; VT_BYREF|VT_DATE BSTR FAR* pbstrVal; VT_BYREF|VT_BSTR IUnknown FAR* FAR* ppunkVal; VT_BYREF|VT_UNKNOWN IDispatch FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATCH SAFEARRAY FAR* FAR* pparray; VT_ARRAY|* VARIANT FAR* pvarVal; VT_BYREF|VT_VARIANT void FAR* byref; VT_BYREF _variant_t是VARIANT的封裝類,其賦值可以使用強制類型轉(zhuǎn)換,其構(gòu)造函數(shù)會自動處理這些數(shù)據(jù)類型。 例如: long l=222; ing i=100; _variant_t lVal(l); lVal = (long)i; COleVariant的使用與_variant_t的方法基本一樣,請參考如下例子: COleVariant v3 = 字符串, v4 = (long)1999; CString str =(BSTR)v3.pbstrVal; long i = v4.lVal;附錄CString,string,char*的綜合比較(一) 概述string和CString均是字符串模板類,string為標準模板類(STL)定義的字符串類,已經(jīng)納入C+標準之中;CString(typedef CStringTTCHAR, StrTraitMFC CString)為Visual C+中最常用的字符串類,繼承自CSimpleStringT類,主要應(yīng)用在MFC和ATL編程中,主要數(shù)據(jù)類型有char(應(yīng)用于ANSI),wchar_t(unicode),TCHAR(ANSI與unicode均可);char*為C編程中最常用的字符串指針,一般以0為結(jié)束標志;(二) 構(gòu)造 string是方便的,可以從幾乎所有的字符串構(gòu)造而來,包括CString和char*; CString次之,可以從基本的一些字符串變量構(gòu)造而來,包括char*等; char*沒有構(gòu)造函數(shù),僅可以賦值; 舉例:char* psz = “joise”;CString cstr( psz );string str( cstr );(三) 運算符重載a) operator= string是最方便的,幾乎可以直接用所有的字符串賦值,包括CString和char*; CString次之,可以直接用些基本的字符串賦值,包括char*等; char*只能由指針賦值,并且是極危險的操作,建議使用strcpy或者memcpy,而且char*在聲明的時候如未賦初值建議先設(shè)為NULL,以避免野指針,令你抓狂; 舉例:char *psz = NULL;psz = new char10; /當然,以上的直接寫成char *psz = new char10;也是一樣memset( psz, 0, 10 );strcpy( psz, “joise” ); CString cstr;cstr = psz;string str;str = psz;str = cstr;delete psz;b) operator+ string與CString差不多,可以直接與char*進行加法,但不可以相互使用+運算符,即string str = str + cstr是非法的,須轉(zhuǎn)換成char*; char*沒有+運算,只能使用strcat把兩個指針連在一起; 舉例:char* psz = “joise”;CString cstr = psz;cstr = cstr + psz;string str = psz;str = str + str + psz;strcat( psz, psz );strcat( psz, cstr );/合法strcat( psz, str );/非法,由此可見,CString可自動轉(zhuǎn)換為const char*,而string不行c) operator += string是最強大的,幾乎可以與所有的字符串變量+

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論