2016-04-18 5 views
-2
#include <stdio.h> 

main() { 
    char *p = "Hello world"; 
    int *q; 
    p++; 

    q = (int*) p; 
    q++; 

    printf("\n %s\n%s", p, q); 
} 

については、このコードの出力を説明しますか? p++ラインでは、このプログラムの出力はこうですポインタ

+0

@Jonny Henly改行がなく、2番目の「世界」の前の実際のスペースが重要なので、出力は2行にないことに気付きますか? – AntonH

+0

@AntonH「世界」の前にスペースがあったことに気付かなかった。しかし、\ n%s \ n%s "には2回の改行があります。 –

+1

@JonnyHenly私の間違い。私たちは両方とも正しい1つのものでした、あなたは改行、私はスペース:) – AntonH

答えて

3

ことがbyte型のサイズなので、pはあなたの文字列の中の「e」を見終わると、あなたは、1によりアドレスpをインクリメントします。

次に、pの同じアドレスをqに割り当てます。したがって、 "e"も表示されます。次に、qをインクリメントしますが、それは整数(型式int、マシンの長さは4バイト)へのポインタであるため、4だけインクリメントされます。それで、前に見ていた "e"に4を加えれば、スペース文字を見ることになります。

+0

私は保存できるかどうか、char型変数 – Ann

+0

の文字集合を知りたいですいいえ、 'char'型の変数には1文字しか保存できません。しかし、あなたの例では、 'p'は' char'型ではなく、 'char'型の変数が格納されているメモリ内の特定のアドレスへの型ポインタです。したがって、印刷時には、ヌル文字が見つかるまで – atturri

+0

これは、タイプのポインタを置くと、** Hello World **を文字に変換するなど、その型の値だけを指示することを意味します。 – Ann

0

char *pは、最初に文字列Hello Worldの最初の文字を指します。文p++は、ポインタpを文字列の2番目の文字を指すように変更します。これは、ポインタpをインクリメントしてから文字列を印刷するときにello worldとなることを説明しています。

ポインタpをintへのポインタであるポインタqに割り当てると、ポインタqをインクリメントすると、ポインターがworldを指すように変更されます(スペース文字を指しています)。これは、intがマシンで4バイト長で、intへのポインタをインクリメントすることにより、ポインタの内容を4バイト増やすためです。したがって、ポインタqを使用して文字列を印刷すると、が印刷されます。

0

これは、文字列(p ++とq ++)を格納した後でポインタ変数をインクリメントしたためです。あなたのprintfステートメントの中には、なぜそれが印刷されているのかという文字だけではなく、全体の印刷がプリントされています。あなたが答えを得たことを願っています!

関連する問題