Welcome

首页 / 软件开发 / VB.NET / API入门系列之三 -那迷惑人的Windows字符和字符指针类型

API入门系列之三 -那迷惑人的Windows字符和字符指针类型2010-01-04 cnblogs beyondcode大家好,通过前面两篇打头文章,我也看了留言,感谢那些给我提意见的人和指出错误之处的人。再次谢谢你们的支持。另外,Windows SDK编程交流群已经建立了,欢迎各位志同道合者加入进行交流(群号:81543028)

本打算通过前面两篇文章的讲解,后来的系列就可以通过使用一些简单的,常用的API写一些示例程序的讲解进行,但是发现还有一个不得不先讲一讲的要点,Windows下和字符串操作有关的数据类型。我看留言中也有几位朋友提到了,那我就在这篇中讲它吧。不会很枯燥的,各位慢慢看下去就是了。

下面我罗列一些我们在Windows平台下编程经常使用到的和字符或字符串有关的数据类型。

char和wchar_t

这两个类型大家绝对不会陌生吧,一个是单字节的字符类型,一个是宽字节的字符类型(也就是 Unicode字符)。

char c = "b";

wcha_t wc = L"b";

上面我就分别定义了2个变量c和wc ,相信第一个定义大家都看的懂,就是定一个字符变量c,其中 保存了"b"这个字符。那么第二个呢? 我相信还是很多人都看的懂,要是你看不懂也没关 系,现在就告诉你,也是定义一个字符变量wc, 只不过这个字符变量是Unicode字符变量,用2个字节 来保存一个字符,而上面的c这个字符变量只有一个字节来保存,那么在"b"前面的L又是什么意 思呢,它就表示这里的"b"这个字符是一个Unicode字符,所以第二个定义的意思就是将 L"b"这个Unicode字符保存到wc这个Unicode字符变量中。

如果我要定义一个字符数组怎么定 义呢? 用分别用单字节的char和宽字节的wchar_t来定义就应该是:

char c[10];

wchar_t wc[10];

如果是要带初始化的字符数组的声明,我们来看看怎么写

char c[] = "beyondcode";

wchar_t wc[] = L"beyondcode";

看到了吗,宽字节的操作其实和单字节的字符操作一样吧,只是在前面加上L表示是宽字节的字符或 者字符串。

上面都是属于C/C++中的知识,并没有涉及太多Windows中的数据类型,那么各位朋友们在Windows编 程中看到的满到处都是的 TCHAR,LPSTR, LPCSTR, LPWSTR, LPCWSTR, LPTSTR, LPCTSTR 这些数 据类型又是怎么回事呢? 别急,我们一步一步的来,最后我会联系到那上面去的。

上面的你都知道或者是理解了的话,那我们继续,除了可以声明一个字符数组,我还可以定义一个字 符指针变量来指向一个字符数组,当然这个字符数组可以是Unicode的宽字节字符数组,也可以是单字节 字符数组,如下:

char c[] = "hello beyondcode"; //定义一个字符数组

wchar_t wc[] = L"hello beyondcode"; //定义一个宽字节字符数组

char *p = c; //定义一个字符指针,指向刚才的字符数组

wchar_t *wp = wc; //定义一个宽字节字符指针,指向刚才的宽字节字符数组

这样之后,我就可以通过指针来改变刚才我们定义的2个数组,例如:

p[0] = "H";

wp[0] = L"H";

把上面2个数组的第一个字符通过指针改变成大写。这里是可以通过指针来修改的,因为我没有定义 指针为常量指针,也就是没有加const 修饰符。如果我像下面这样定义的话,那么就不能通过这些指针 来改变他们所指向的数据了,而是只有读取他们。

const char *p = c;

const wchar_t *wp = wc;