2013-01-22 78 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

使用偏移整數與使用此應用程序的指針沒有技術優勢。如果你想說「更好」,你必須說明原因。 –