原文地址:LPCTSTR,LPCSTR,LPTSTR,LPSTR的区别及用法作者:阳光守望者
LPCSTR 32-bit 指针,指向一个常量字串
LPSTR 32-bit 指针,指向一个字串
LPCTSTR 32-bit 指针,指向一个常量字串。此字串可移植到Unicode 和DBCS
LPTSTR 32-bit 指针,指向一个字串。此字串可移植到Unicode 和DBCS
---------------------------------------------------------------------------------------------------------
L表示long指针, 这是为了兼容Windows 3.1等16位操作系统遗留下来的, 在win32中以及其他的32为操作系统中, long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。
P表示这是一个指针,C表示是一个常量T在Win32环境中,有一个_T宏,这个宏用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。STR表示这个变量是一个字符串。
所以LPCTSTR就表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。同样, LPCSTR就只能是一个ANSI字符串,在程序中我们大部分时间要使用带T的类型定义。LPCTSTR == const TCHAR *
-------------------------------------------------------------------------------------------------
char是C语言标准数据类型,字符型,至于由几个字节组成通常由编译器决定,一般一个字节。Windows为了消除各编译器的差别,重新定义了一些数据类型,你提到了另外几个类型都是这样。CHAR为单字节字符。还有个WCHAR为Unicode字符,即不论中英文,每个字有两个字节组成。如果当前编译方式为ANSI(默认)方式,TCHAR等价于CHAR,如果为Unicode方式,TCHAR等价于WCHAR。在当前版本LPCSTR和LPSTR没区别,即以零结尾的字符串指针,相当于CHAR *。
--------------------------------------------------------------------------------------------------
LPSTR、LPCSTR相当于char *,所以这种类型变量的赋值等同于char *的赋值。如果你不了解char *的赋值,你需要去看看C语言入门的书,比如谭浩强的《C语言程序设计》第9章就介绍了这个问题。下面给出两个例子,一个是直接赋值,另一个是间接的。
Ex1: LPSTR lpstrMsg = "I'm tired.";
Ex2: char strMsg[]="I'm tired.";
LPSTR lpstrMsg = (LPSTR) strMsg;