-1

次のようなコード例:

#include<stdio.h>
void main()
{
    char *s={"abcd"};
    do {
        printf("%d\n",++s);
    } while(*s);
}  

ループが終了したとき、ポインターはどこを指していますか?どのように機能しますか?

4

3 に答える 3

4

C では、ゼロは に相当しfalseます。その*sため、文字列内の終端文字 (ゼロ) を指すと、ループが停止します。

于 2013-05-19T15:35:48.207 に答える
3

「abcd」は、5 つの連続するバイトでメモリに格納されます: 'a' 'b' 'c' 'd' '\0'.

C ではゼロは false であるため、最後のバイトであるゼロはループを終了します。

于 2013-05-19T15:36:23.953 に答える
0

まず第一に%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.
}
于 2013-05-19T16:40:11.280 に答える