理解*ptr++

2805 ワード

これはC言語におけるポインタの基本的な使い方の一つですが、まず小さな例を見てみましょう.コードは次のとおりです.
int main(void)
{
    char *p = "Hello";
    while(*p++)
        printf("%c", *p);
    return 0;
}

このコードの最初の文の式:
char *p = "Hello";

charタイプを指すポインタpを宣言しましたが、「charタイプを指すポインタ」と言ったときはいったいどういう意味ですか?実際には簡単です.pの値はcharタイプの要素を格納するアドレスで、pはメモリにこのようなアドレスが格納されているのはcharタイプの変数であることを教えてくれます.
この式はポインタpを初期化し、文字列「Hello」の最初の文字を指す.この点については、pが文字列全体を指すのではなく、最初の文字「H」、すなわちpの値が文字列「Hello」の「H」のアドレスであることを常に覚えなければならない.
次はループです.
while (*p++)

この中の*p++はどういう意味ですか?一般的な初心者には次のような疑問があります.
  • プレフィックス++および間接値*の優先度.
  • 接尾辞が式の値を増分する場合.
  • 接尾辞自己増分式の副作用.

  • 1、優先度演算子の優先度表を見ると、接尾辞演算子の優先度(16)が参照演算子(15)より高いことがわかります.すなわち、*p++は*(p++)と表すことができ、つまり*はp++に作用することができます.まずP++部分を見てみましょう.
    2、接尾辞式の値、p++の値はP++式のPより前の値です.あなたが持っているとします.
    int i = 7;
    printf("%d
    ", i++); printf("%d
    ", i);

    出力は次のようになります.
    7
    8

    i++の値はiが増加する前の値であることがわかります.では、P++は、Pが増加する前の値です.pの値は「H」のアドレスです.
    次に*P++は簡単で、*はpの現在のアドレスに格納されている値、すなわち「H」を取り出すことを表す.
    *p++が「H」を表している以上、なぜ表示されていないのかと聞かれるかもしれませんが、次は副作用についてお話しします.
    3、接尾辞式の副作用、接尾辞++式の値は現在の変数の値ですが、この式の演算後に副作用があります.上のコードと出力を振り返ってみましょう.
    1番目のprintf()関数ではi++の値は7ですが、C言語では次の文の実行前の時刻(ある時刻はこの時刻が機械に関連しているため)に、この文の副作用が生じることが保証されます.つまり、2番目のprintf()実行前のiの値は必ず加算されます.ちなみに、C規格ではこのような保証がある副作用は数少ないです.
    一番前のコードでは*P++が実行されると「H」という文字を指していましたが、その後pの値が1つ加算され、最終的に画面に表示されるのがelloです.
    転載先:https://www.cnblogs.com/programnote/p/4716189.html