2013-01-22 79 views
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 - 从begining移动开始FWD的
PT2 - 从年底开始向后移动
现在我不想让他们继续一旦他们在中间相遇..
所以我检查,如果总是PT1 为什么?我不比较* pt1 vs * pt2。
它比较哪些值?指针如何比较?

回答

2

这是三个概念主导的代码块执行正确:

  1. 你的指针连续的存储器块上操作(输入字符串)
  2. 指针“值”是地址(基本上在运行时分配只是任意数字)
  3. ç分配定义在良好的连续存储器地址,增加的方式

由于这样的事实,PO inters实际上只是整数(如0x000001,0x000002等),你可以在它们上使用比较运算符。

最后由于这样的事实,该字符串的内存将是连续的增加,有一个抽象层,你可以做:指针进一步沿着记忆将评估大于前面在地址记忆。

+0

s/continuous/contiguous/g :) +1 –

4

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

+3

鸡蛋里挑骨头:标准不要求指针实际上是内存地址;尽管人们可以说对它们的要求意味着一种内存地址模型。一致的实现可以存储段偏移量或类似的指针。但+1。 –

1

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

当他们在中间相遇时,他们不会继续,因为当a == b,那么a < b必须是假的。

1

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

+0

是不是方法1更好?这是因为指针指向的值可能沿同一内存行相同。我对吗? – lakesh

-3

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

+0

完全错误。比较指针这种方式有完全明确的行为。 –

+0

你可能会更好地从字面上“消费”来自两端的字符串。这实际上取消了一个字符,在字符串的开始和结束之间交替。那么你根本不需要进行比较,因为当它们相遇并且循环终止时,字符串将变为完全消耗(空)。 – chris

+0

使用偏移整数与使用此应用程序的指针没有技术优势。如果你想说“更好”,你必须说明原因。 –