次のようなコード例:
#include<stdio.h>
void main()
{
char *s={"abcd"};
do {
printf("%d\n",++s);
} while(*s);
}
ループが終了したとき、ポインターはどこを指していますか?どのように機能しますか?
C では、ゼロは に相当しfalse
ます。その*s
ため、文字列内の終端文字 (ゼロ) を指すと、ループが停止します。
「abcd」は、5 つの連続するバイトでメモリに格納されます: 'a' 'b' 'c' 'd' '\0'
.
C ではゼロは false であるため、最後のバイトであるゼロはループを終了します。
まず第一に%d
、ポインターの書式設定には使用しないでください。これは整数用であり、ポインター用ではありません。%p
代わりに使用してください。
この行-
char *s={"abcd"};
'\0'
最後の文字として文字列を初期化します。
プログラムは、文字列の各文字 (2 番目から最後まで) をループし、メモリに格納されている場所のアドレスを出力します。ループなので、do-while
ループ本体の実行後に条件チェックを行います。
注:最初の文字のアドレスは出力されません。
printf("%d\n",++s);
この行 (接頭辞のインクリメントによる) は、ポインタを次の文字にインクリメントしてから、その値を に渡しますprintf
。そのため、ループの本体が最初に実行されると、2 番目の文字 ( b
) のアドレスが出力されます。
s
ここで、ループの条件部分で、 が指す文字 ( で参照できる文字*s
) がゼロでないかどうかをチェックします。
文字列は'\0'
最後の文字 (整数値は0
) であるため、ループは最後の文字に到達すると終了します。
プログラムの出力 (に%d
変更%p
) は次のようになりますが、まったく同じではありません-
0x40061d
0x40061e
0x40061f
0x400620
4 つのアドレスのみが印刷されることに注意してください ( から'b'
まで'\0'
、 のアドレスは'a'
印刷されません)。そのためには、これを試してください-
#include<stdio.h>
main()
{
char *s={"abcd"};
do {
printf("%p\n",s++);
} while(*s);
printf("%p\n", s); // to print the address of the '\0' character.
}