次のようなコード例:
#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.
}