2011-06-28 17 views
1
void main() 

{ 

printf("ABCD"); 

    printf("\n"); 

    printf("ABCD" +1); 

    printf("\n"); 

    printf("ABCD" +3); 

} 

出力です:Printf( "ABCD"); printf( "ABCD" +1);

ABCD 

BCD 

D 

誰が、なぜ私を説明できますか?

+0

私のシステムでは、これはABCDを出力し、それから普通のDを出力します。 "ABCD" + 3の出力をBCDとして得ていますか? –

+0

@pgm私はそれを気に入らないが、実際にはsyscallの出口(0)で終了するべきである。 – DipSwitch

+0

@Dip: 'void main'はフリースタンディングの実装(電子レンジ、ABSシステム、空調システムなど)でのみ有効です。 )。ホストされた実装のコンパイラ(オペレーティングシステムを持っているもの)は、 'void main'を含むソースファイルがあると、あなたのハードディスクを自由にフォーマットすることができます。 – pmg

答えて

16

"ABCD"は、実際には文字の配列{'A','B','C','D', '\0'}'\0'は末尾のヌルバイト)です。それに3を加えると、それはAから3バイト先に進んだポインタと等価なので、最後にDを指してしまいます。

質問6.2 in the C FAQには、これがより明確になる画像があります。配列は6.4に記述されているようにポインタに減衰するので、変数pの状況になります。

char a[] = "hello"; 
char *p = "world"; 

Picture from C FAQ

+0

@pmgは私の変更を明確にしますか?何をお勧めしますか?私はあなたが「ポインタに崩壊する」という意味をよく理解していません。 –

+0

私は、この規格が用語「崩壊」を使用していると考えました。それはそうでないことが分かる。配列は、ほとんどのコンテキストで最初の要素へのポインタに変換されます。[C標準](http://www.open-std.org/JTC1/sc22/wg14/www/docs/n1256)の6.3.2.1/3を参照してください。 pdf)。 – pmg

+1

@pmg FAQの項目を紹介してくれてありがとう。 –

5

"ABCD"ヌルターミネータ(\0)、続いて4つの文字を含むメモリブロックへのポインタとして扱われます。

"ABCD" + 1ポインタにを追加すると、1バイト先を指すようになります。