1.要定义包含一个宽字符的变量,可使用下面的语句:
wchar_t c = 'A'
变量c是一个双字节值0x0041,是Unicode表示的字母A。(然而,因为Intel微处理器从最小的字节开始储存多字节数值,该字节实际上是以0x41、0x00的顺序保存在内存中。)
指向宽字符的指针: wchar_t * pw = L"Hello!"
再次调用strlen : iLength = strlen (pw)
现在麻烦来了。首先,C编译器会显示一条警告消息,可能是这样的内容: 'function' : incompatible types - from 'unsigned short *' to 'const char *' 这条消息的意思是:声明strlen函数时,该函数应接收char类型的指标,但它现在却接收了一个unsigned short类型的指标。您仍然可编译并执行该程序,但您会发现iLength等于1。为什么?
字符串「Hello!」中的6个字符占用16位: 0x0048 0x0065 0x006C 0x006C 0x006F 0x0021
Intel处理器在内存中将其存为: 48 00 65 00 6C 00 6C 00 6F 00 21 00
假定strlen函数正试图得到一个字符串的长度,并把第1个字节作为字符开始计数,但接着假定如果下一个字节是0,则表示字符串结束。
2.内存存储
图一
图二
例一
std::cout<<sizeof(short)<<std::endl; unsigned short us = 0xE5F6; unsigned char *c = (unsigned char*)&us; for(int i = 0; i < sizeof(short); ++i, ++c) printf("0x%p : 0x%02x ", c, *c);结果
例二
std::cout<<sizeof(int)<<std::endl; unsigned int ui = 0xA1B2C3D4; unsigned char *c = (unsigned char*)&ui; for(int i = 0; i < sizeof(int); ++i, ++c) printf("0x%p : 0x%02x ", c, *c);结果
例三
unsigned int ui[2]; ui[0] = 0xA1B2C3D4; ui[1] = 0xE5F60102; unsigned char *c = (unsigned char*)&ui; for(int i = 0; i < 8; ++i, ++c) printf("0x%p : 0x%02x ", c, *c);结果
结论:
存储特点:位置从上到下、地址从低到高,口诀:天上人间、剑法