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*が回文を指しているかどうかをチェックする関数です。
ここで2つのポインタ
pt1-開始から開始fwdspt2-
終了から開始後方に移動し
ます。途中で出会ったら続行したくないので
、常にpt1かどうかを確認します。なぜですか。*pt1と*pt2を比較していません。
どのような値を比較しますか?

4

5 に答える 5

4

ポインタは、メモリ内の場所を指します。したがって、ポインタの値はメモリアドレスです。特定のメモリ割り当ての場合、その中のすべてのバイトは連続しており、次に高いアドレスが割り当てられています (0x0000、0x0001、0x0002 など)。したがって、ポインタが別のポインタよりも大きく、両方のポインタが同じメモリ割り当てに属している場合、それは上記の割り当てでさらに進んでいます。

于 2013-01-22T02:17:29.667 に答える
3

これらは、コードのこのブロックが正しく実行される 3 つの概念です。

  1. あなたのポインターは、メモリの連続ブロック(入力文字列)で動作しています
  2. ポインターの「値」はアドレスです (基本的には実行時に割り当てられる任意の数値)
  3. Cは、明確に定義された増加する方法で連続メモリのアドレスを割り当てます

ポインターは実際には単なる整数 (0x000001、0x000002 など) であるため、比較演算子を使用できます。

最後に、文字列のメモリが連続して増加するという事実のために、作成できる抽象化のレベルがあります。メモリ内のさらに先のポインタは、メモリ内の前のアドレスよりも大きいと評価されます。

于 2013-01-22T03:08:23.000 に答える
1

ポインタはメモリ アドレスをモデル化します。最初のポインタは 2 番目のポインタよりも前のメモリ内のどこかを指しているため、より小さい比較は成功します。

when a == b, thena < bは false でなければならないため、途中で出会うと続行しません。

于 2013-01-22T02:18:42.260 に答える
1

コードで使用する比較には 2 種類ありpt1 < pt2ます*pt1 != *pt2。最初のケースでは、メモリ アドレスを比較します。つまり、文字列内の現在の位置を比較します。一度pt1 >= pt2、あなたのポインターは交差しているか、交差しています。2 番目のケースでは、 -operator を使用してポインターを逆参照し、これらのポインターが指す値を比較します。*

于 2013-01-22T02:19:17.763 に答える
-3

ポインタはアドレスです。2 つのポインターを比較すると、それらのアドレスが比較されますが、これは使用するには不適切です。位置がいつ一致するかを把握するには、オフセットまたはその他の整数型の変数を維持する必要があります。

于 2013-01-22T02:19:41.627 に答える