2
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 - 从开始移动 fwds
pt2 - 从结束开始向后移动
现在我不希望它们在中间相遇时继续..
所以我检查是否总是 pt1 为什么?我不是在比较 *pt1 和 *pt2。
它比较什么值?

4

5 回答 5

4

指针指向内存中的一个位置。因此,指针的值是内存地址。对于给定的内存分配,其中的每个字节都是连续的,并且分配给它的下一个更高的地址(0x0000、0x0001、0x0002 等)因此,当一个指针大于另一个指针并且两个指针属于相同的内存分配时,它在所述分配中更进一步。

于 2013-01-22T02:17:29.667 回答
3

以下是导致此代码块正确执行的三个概念:

  1. 您的指针在连续的内存块(输入字符串)上运行
  2. 指针“值”是地址(基本上只是在运行时分配的任意数字)
  3. C 以定义明确的递增方式为连续内存分配地址

由于指针实际上只是整数(例如 0x000001、0x000002 等),因此您可以对它们使用比较运算符。

最后,由于字符串的内存将是连续且不断增加的,因此您可以进行一定程度的抽象:内存中更远的指针将评估为大于内存中更早的地址。

于 2013-01-22T03:08:23.000 回答
1

指针模型内存地址。因为第一个指针在第二个之前指向内存中的某个位置,所以小于比较成功。

他们在中间相遇时不会继续,因为 when a == b, thena < b一定是假的。

于 2013-01-22T02:18:42.260 回答
1

您在代码中使用了两种比较,pt1 < pt2*pt1 != *pt2. 在第一种情况下,您比较内存地址,即您现在在字符串中的哪个位置。一旦pt1 >= pt2,您的指针正在交叉或将要交叉。在第二种情况下,您使用 -operator取消引用指针*并比较这些指针指向的值。

于 2013-01-22T02:19:17.763 回答
-3

指针是地址。当您比较两个指针时,它正在比较它们的地址,这对您的使用是错误的。您需要维护一个偏移量或其他整数类型的变量来确定位置何时相遇。

于 2013-01-22T02:19:41.627 回答