理解*ptr++
2805 ワード
これはC言語におけるポインタの基本的な使い方の一つですが、まず小さな例を見てみましょう.コードは次のとおりです.
このコードの最初の文の式:
charタイプを指すポインタpを宣言しましたが、「charタイプを指すポインタ」と言ったときはいったいどういう意味ですか?実際には簡単です.pの値はcharタイプの要素を格納するアドレスで、pはメモリにこのようなアドレスが格納されているのはcharタイプの変数であることを教えてくれます.
この式はポインタpを初期化し、文字列「Hello」の最初の文字を指す.この点については、pが文字列全体を指すのではなく、最初の文字「H」、すなわちpの値が文字列「Hello」の「H」のアドレスであることを常に覚えなければならない.
次はループです.
この中の*p++はどういう意味ですか?一般的な初心者には次のような疑問があります.プレフィックス++および間接値*の優先度. 接尾辞が式の値を増分する場合. 接尾辞自己増分式の副作用.
1、優先度演算子の優先度表を見ると、接尾辞演算子の優先度(16)が参照演算子(15)より高いことがわかります.すなわち、*p++は*(p++)と表すことができ、つまり*はp++に作用することができます.まずP++部分を見てみましょう.
2、接尾辞式の値、p++の値はP++式のPより前の値です.あなたが持っているとします.
出力は次のようになります.
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
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