2016-12-06 9 views
0
#include <iostream> 
using namespace std; 
int main() 
{ 
char str[] {"TESTING"}; 
char *p {str}; 
cout << (p++, *++p); 
cout << *p++; 
cout << p; 
return 0; 
} 

ポインタとchar配列の混乱

私は多分この記事はstackoverflowのために正確ではありませんが、私はそれが何をするかを把握することはできませんし、約任意のドキュメントを見つけることができませんでした知っていますそれは

cout << (p++, *++p); 

最初に私は括弧で丸括弧を見た...彼らの機能は何ですか?

単独でこの行は、「テスト」と言うべきではありませんが、唯一TING

cout << p; 

はありがとうと言っているようです!

+0

'の結果(a、b、c)は' Cです。それが役に立ったら – pm100

答えて

2

のは、行ごとに行こう:

char str[] {"TESTING"}; 

この行は、8つの文字の種類配列のstrという名前の変数を定義し、終わりをマークする文字TESTINGプラスNULの文字で初期化します。

char *p {str}; 

この1つはをcharにタイプのpポインタという名前の変数を定義し、アレイstr(第T)の最初の文字のアドレスに初期化します。これは、配列が自動的にほとんどの用途でポインタに崩壊するために発生します。

cout << (p++, *++p); 

この行にはいくつかのことがあります。 ,オペレータは、最初にポインタをインクリメントする左オペレータp++を評価し、今度はEを指します。右手の演算子*++pを評価しますが、これはプリインクリメント演算子ですので、ポインタを再度インクリメントします(ポインタはSを指します)。最後に*オペレータがpが指すメモリにアクセスすると、結果はSになります。その文字はSTDOUTに出力されます。

cout << *p++; 

これは簡単です。 *オペレータは、pS)が指すcharにアクセスし、STDOUTに出力します。ポストインクリメント演算子であるため、ポインタをインクリメントします。今度は2番目のTを指しています。

cout << p; 

と、少なくとも、このラインは、それがNUL文字を見つけるまで文字列がpによって指さ印刷します。 pは、配列の2番目のTを指しているので、TINGと表示されます。

これらの出力をまとめてSSTINGとします。

+0

お返事ありがとうございました。 '、'演算子をもう一度説明できますか?なぜ2つの間にSを表示するのですか(E、S) – user5372775

+0

'、'演算子は実際には単純です。 'E、S'という表現は次のように評価されます:最初に' E'を評価して結果を破棄し、 'S'を評価し、その結果を完全な式の値として使用します。通常、 'E'は副作用のために存在し、実際の値ではありません。 – rodrigo

+0

この場合の評価は...?だから、基本的に '、'の2番目の部分を出力していますか? – user5372775

1

ない正確な答えが、コード何をやっていたの内訳、

#include <iostream> 

using namespace std; 

int main() 
{ 
    char str[]{"TESTING"}; 
    char *p{str}; // p points to: 'T' 
    p++;   // p points to: 'E' 
    ++p;   // p points to: 'S' 
    cout << *p; // output a single char: 'S' 
    cout << *p; // ouptut a single char: 'S' 
    p++;   // p points to: 'T' 
    cout << p; // output a (char *) type pointer, AKA a C-string, "TING"; 

    return 0; 
}