2017-06-26 16 views
-2

文字にアクセスする際や明示的にASCII番号に変換するときに問題があります。考えてみましょう以下のコード:文字の値を返すべき、p[4]p[2]を有する発現にもかかわらず、p=p+p[4]-p[2]を使用しているとき、私はコンパイルエラーを取得しないC++のポインターによる文字配列へのアクセス

include<iostream> 

using namespace std; 

int main() 
{ 

    char* p; 

    char s[100]="hello world"; 

    p=s; 

    cout<<p[2]<<endl;//This gives the actual character from the string "hello 
    //world": "l" 

    p=p+p[4]-p[2];//But this does something different, it basically uses 

//ASCII values of the characters at p[4] and p[2] and uses them to do 
//pointer arithmetic 

    cout<<p;// gives "lo world" 

    return 0; 

} 
+1

"私の質問です:なぜ" cout <" - 何ですか? –

+0

ヒント:文字は実際にはちょうど小さな(小)整数です –

+0

std :: stringを使用してください –

答えて

0

?それは値の小さい範囲の整数型として扱われるように、C++ char

は、一体データ型考えられます。

C++は、右側で整数をとるポインタの加算/減算演算を定義します。 charは整数型であるため、ポインタ算術演算の値はintに昇格されます。

1

これは、pがベースアドレスを保持しているためです。 p = p + p [4] - p [0]のとき、 'o'(p [4])のascii値は111で、 '1'(p [2])のascii値は108です。

2]

あなたはベースアドレスを更新しています。これは、pのベースアドレスがxであると仮定します。 updatationのpの後

は、x + 111になります - 108 => X + 3

したがって、あなたが取得している文字列は、最初の3つの文字 "HEL" はスキップなっている、 "LOの世界" です。

+0

asciiは必須ではありません。文字の値が実装定義されています – NathanOliver

+0

なぜ、彼はショーの出力を得ているのではないのですか?質問は明示的にせずに 'char'が暗黙的に' int'に変換される理由です。 OPがその部分を削除しました。 –

関連する問題