首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

指针算术,指针相减,该怎么解决

2013-07-01 
指针算术,指针相减#include iostream#include ctype.h#include string.h bool GetWord(char *theStr

指针算术,指针相减

#include <iostream>
#include <ctype.h>
#include <string.h>
 
bool GetWord(char *theString, char *word, int &wordOffset);
 
int main()
{
const int bufferSize=255;
char buffer[bufferSize+1];
char word[bufferSize+1];
int wordOffset=0;
 
std::cout << "Enter a string: ";
std::cin.getline(buffer, bufferSize);
 
while (GetWord(buffer, word, wordOffset))
std::cout << "Got this word: " << word << std::endl;
 
return 0;
}
 
bool GetWord(char *theString, char *word, int &wordOffset)
{
if (theString[wordOffset]==0)
return false;
 
char *p1, *p2;
 

p1=p2=theString+wordOffset;
 
for (int i=0; i<(int)strlen(p1) && !isalnum(p1[0]); i++) 
p1++;
 
if (!isalnum(p1[0]))
return false;

p2=p1;
 
while (isalnum(p2[0]))
p2++; //p2【0】开始,循环到不是字符或数字
 
int len=int (p2-p1); //P2[4]-P1[0]=4
strncpy(word, p1, len);
word[len]='\0';
 
for (int j=int(p2-theString); j<(int)strlen(theString) && !isalnum(p2[0]); j++)
p2++;
 
wordOffset=int(p2-theString);
 
return true;
}


这个程序运行,输入:this code first appeared in c++ report

第一次运行到此处
for (int j=int(p2-theString); j<(int)strlen(theString) && !isalnum(p2[0]); j++)
请问这条语句p2-theString,什么意思?

第一次循环this code first appeared in c++ report变成  code first appeared in c++ report 

P2 是 code first appeared in c++ report 
theString 是 this code first appeared in c++ report

指针相减 p2-theString 等于多少?就这一句看不懂,请给我解释下,谢谢。
[解决办法]
指针相减就是两个指针的地址相减再除以指针指向类型的尺寸,也就是两指针间相差的元素个数。这里因为char的长度是1,所以指针相减就是地址相减。


[解决办法]
指针相减可以理解为两个指针相差了几个“位置”,这个位置差的意思就是指针对应的类型的几个元素。
如果是char*,因为一般一个char占一个字节,所以指针差是2就说明前后差2个位置,地址值的差也是2;
如果是int *,因为一般一个int占4字节,那么如果指针地址值相差8,实际的位置相差就是8/sizeof(int) = 2;直接用指针相减,编译器自动得出这个2,而不是实际的地址的差值
[解决办法]

热点排行
Bad Request.