int palindrome(char * str){
char * pt1 = str;
char * pt2 = str;
if(pt1==NULL){
std::cout<<"\n invalid string";
return -1;
}
while(*pt2 != '\0')
pt2++;
pt2--;
while(pt1 < pt2){ // why does this work correctly ?
if(*pt1 != *pt2){
std::cout<<"\n not palindrome";
return 0;
}
else{
pt1++;
pt2--;
}
}
std::cout<<"\n yes palindrome";
return 1;
}
您好
这是一个检查传递的char *是否指向回文的功能。
这里有两个指针
pt1 - 从开始动作开始
pt2 - 从结束开始向后移动
现在我不希望他们一旦在中间见面就继续..
所以我检查是否总是pt1
为什么?我不是在比较* pt1和* pt2
它比较了什么价值?
答案 0 :(得分:4)
指针指向内存中的某个位置。 因此,指针的值是存储器地址。对于给定的内存分配,其中的每个字节都是连续的,并为其分配了下一个更高的地址(0x0000,0x0001,0x0002,依此类推) 因此,当指针大于另一个指针并且两个指针属于相同的内存分配时,它在所述分配中更进一步。
答案 1 :(得分:2)
这是导致这段代码正确执行的三个概念:
由于指针实际上只是整数(例如0x000001,0x000002等),因此可以在它们上使用比较运算符。
最后,由于字符串的内存将是连续且不断增加的,因此您可以进行抽象级别:内存中的指针将进一步评估为而不是早先在中的地址。
答案 2 :(得分:1)
指针模拟内存地址。因为第一个指针在第二个指针之前指向内存中的某个位置,所以比较成功。
当他们在中间相遇时,他们不会继续,因为当a == b
时,a < b
必须为假。
答案 3 :(得分:1)
您在代码中使用了两种比较,pt1 < pt2
和*pt1 != *pt2
。在第一种情况下,您比较内存地址,即您现在在字符串中的位置。一旦pt1 >= pt2
,您的指针正在穿越或将越过。在第二种情况下,使用*
- 运算符取消引用指针,并比较这些指针指向的值。
答案 4 :(得分:-3)
指针是地址。当你比较两个指针时,它会比较它们的地址,这对你的使用是错误的。您需要维护一个偏移量或整数类型的其他变量,以确定何时位置相遇。