LPTSTR、LPCSTR、LPCTSTR、LPSTR和CString

来源:互联网 发布:kpi绩效考核软件 编辑:程序博客网 时间:2024/06/06 09:05

刚使用MFC总能碰到很多稀奇古怪的符号LP***,LPC***,LPCT**之类的,不过用习惯了,也就不没什么问题了,

说白了也就是一些指针类型而已,但当让你自己写函数的时候,你或许就会迷茫,不知道在什么时候该用什么类型的指针。

本文就专门为你介绍各类型的含义和作用。

 

L 表示long指针
P 表示这是一个指针
C 表示是一个常量

T 表示在Win32环境中, 有一个_T宏

 

CString的含义就不用说了吧?

下面介绍下LPTSTR、LPCSTR、LPCTSTR、LPSTR的意义:

LPSTR:32bit指针 指向一个字符串,每个字符占1字节

LPCSTR:32-bit指针 指向一个常字符串,每个字符占1字节
LPCTSTR:32-bit指针 指向一个常字符串,每字符可能占1字节或2字节,取决于Unicode是否定义
LPTSTR:32-bit指针 每字符可能占1字节或2字节,取决于Unicode是否定义

 

也就是说LPCSTR跟LPCTSTR只是支不支持Unicode的区别而已,其他功能都类似。

CString 和 LPCTSTR 基本可以通用,这就是C++的重载的作用之一……

 

但是 LPTSTR又不同了,他是 char*,意味着你随时可能修改里面的数据,这就需要内存管理了(如字符串变长,原来的存贮空间就不够了,则需要重新调整分配内存)。 
所以 不能随便的将 const char* 强制转换成 char* 使用。

 

CString 转换到 LPTSTR (char*), 预定的做法是调用CString的GetBuffer函数,使用完毕之后一般都要再调用ReleaseBuffer函数来确认修改 (某些情况下也有不调用ReleaseBuffer的,同样你需要非常明确为什么这么做时才能这样子处理,一般应用环境可以不考虑这种情况)。

同时,在GetBuffer 和 ReleaseBuffer之间,CString分配了内存交由你来处理,因此不能再调用其他的CString函数。

CString 转LPCTSTR例子:
CString cStr;
const char *lpctStr=(LPCTSTR)cStr;

LPCTSTR转CString:
LPCTSTR lpctStr;
CString cStr=lpctStr;



 

 

LPCTSTRLPTSTR,CString主要是应用场合不同:

-需要对字符串作复杂处理,用CString合适; 
-函数参数需要调用某字符串值而不需改变它,用LPCTSTR合适; 
例如定义函数 OpenMyFile(LPCTSTR FileName) 
-函数参数需要调用某字符串值而在函数中可能改变,用&CString; 
例如定义函数 GetMyName(CString &strMyName) 
-函数参数需要调用某指向字符串的非常数指针,用LPTSTR和 
CString的GetBuffer合适。例如函数 DoSomeThing(char *pSome), 
调用时可以用 
CString Str1(_T"asdfasdf"); //可以用Str1作些查找、替换的活 
LPTSTR pMyVal=Str1.GetBuffer(-1); 
DoSomeThing(pMyVal); 
Str1.ReleaseBuffer(); 

 

用下面这个函数可以看看几种类型的使用。有些东西例如暂时变量释放引
起指针指向值的变化、字符串空间申请与释放还得啃MSDN

CString ChangeStr(LPCTSTR pcstr, LPTSTR pstr,CString str,CString &str_ref) 

CString tempstr; 
tempstr=pcstr; pcstr=_T("asdf"); 
tempstr=pstr; pstr=_T("asdf"); 
tempstr=str; str=_T("asdf"); 
tempstr=str_ref; str_ref=_T("asdf"); 
return tempstr; 

void teststr() 

LPCTSTR pcStr=_T("generic data1"); 
LPTSTR pStr=_T("generic data2"); 
CString Str=_T("generic data3"); 
CString Str1=_T("generic data4"); 
CString Str2; 
pcStr=_T("generic data01"); 
pStr=_T("generic data02"); 
Str=_T("generic data03"); 

Str2=ChangeStr(pcStr,pStr,Str,Str1); 
pcStr=Str; 
pStr=Str.GetBuffer(); 
}   

原创粉丝点击