今天在做文件名处理时,发现以前对不同类型的指针之间做减的理解有误。
得到文件名(ptcFilename)后,想要过滤掉后缀、再做显示。于是用了 wcsrchr() 函数得到文件名中最后一个 . 的位置指针(ptcSuffix)。
通过 ptcSuffix - ptcFilename 可以获得到偏移量。
例如: 不考虑 ptcSuffix 和 ptcFilename 的类型时, 当 ptcSuffix = 0x1f81e0, ptcFilename = 0x1f81f0,则 ptcSuffix - ptcFilename = 0x10,十进制为: 16。
由于在 WinCE 下,一般字符串都是 TCHAR 类型的,所以我就想得到的值再除以 sizeof(TCHAR) 就可以得到想要的偏移量,即 (ptcSuffix - ptcFilename) / sizeof(TCHAR)。
按此想法 Coding 后运行,发现没有得到想要的显示字符串,比想要的字符串短了一半左右。
想想实现的思路应该是没有错的,那么错在哪里?唯一值得怀疑也就是: ptcSuffix - ptcFilename 的值。
于是写了一个简单的测试函数,如下:
1 void TestPointOfTypes(void) 2 { 3 #define POINT_START 0x1f81e0 4 #define POINT_END 0x1f81f0 5 char *pcStart = (char *)POINT_START; 6 char *pcEnd = (char *)POINT_END; 7 TCHAR *ptcStart = (TCHAR *)POINT_START; 8 TCHAR *ptcEnd = (TCHAR *)POINT_END; 9 int *piStart = (int *)POINT_START; 10 int *piEnd = (int *)POINT_END; 11 double *pdStart = (double *)POINT_START; 12 double *pdEnd = (double *)POINT_END; 13 14 //运行结果: from 0x1F81E0 to 0x1F81F0: char: 16;TCHAR: 8;int: 4;double: 2 15 RETAILMSG(1,(L"from 0x%X to 0x%X: char: %d;TCHAR: %d;int: %d;double: %d ", 16 POINT_START,POINT_END, 17 pcEnd - pcStart, 18 ptcEnd - ptcStart, 19 piEnd - piStart, 20 pdEnd - pdStart)); 21 }
验证了自己的想法,指针之间的减法与指针的类型有关。