指针减法

今天在做文件名处理时,发现以前对不同类型的指针之间做减的理解有误。
得到文件名(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\r\n",  
16     POINT_START,POINT_END,  
17     pcEnd - pcStart,  
18     ptcEnd - ptcStart,  
19     piEnd - piStart,  
20     pdEnd - pdStart));  
21 }  


验证了自己的想法,指针之间的减法与指针的类型有关。

posted @ 2016-02-19 16:36  91program  阅读(490)  评论(0编辑  收藏  举报