私のプログラムは以下のとおりです。
#include<stdio.h>
main()
{
int x=30,*y,*z;
y=&x;
z=y;
*y++=*z++; //what does this mean?
x++;
printf("%d %d",y,z);
return 0;
}
このステートメントの意味は何ですか:*y++=*z++
?
これは次と同等です。
*y = *z;
y++;
z++;
このプログラムの出力がわかりません
あなたはポインタを印刷しているので、理解することはあまりありません。
%p
の代わりに使用する必要があります%d
y
とz
はポインタであり、式y++
とz++
は接尾辞演算子を使用しているため、両方の増分は代入後に発生します。
このステートメントは3つのことを行います。
y
:が指すのと同じ値が指す値に割り当てz
ます*y = *z
。y
ポインタをインクリメントします。ここで、メモリ内の次y
を指します。 int
z
ポインタをインクリメントします。ここで、メモリ内の次z
を指します。 int
最後の2つは、ステートメントの後に使用された場合はy
不適切です。そして、コードに属していない初期化されていないメモリを指します。z
y
z
*y++=*z++;
z
- これは、ポインタに格納されている値を に代入しているだけ*y
です。y
この後、両方とz
ポインターがインクリメントされます。このステートメントの後、 と の両方z
を逆参照するとy
、クラッシュ (未定義の動作) が発生する可能性があります。
この種のステートメントは、文字列コピーの実装で使用されます
void my_strcpy(char *dest, char* src)
{
while((*dest++ = *src++));
}
それは次と同じです:
*y = *z;
++z;
++y;
これは、が指すオブジェクトの値を、が指すオブジェクトの値に割り当てるだけで、y
両方z
のポインタをインクリメントします。
yが指すオブジェクトの値をzが指すオブジェクトの値に割り当てるだけで、最後に両方のポインターがインクリメントされます。
変数y
とz
は整数へのポインターであり、この場合、変数 x のアドレスを指します。
次の行は、 の値y
を のアドレスに設定しますx
(つまり&x
、`x のアドレスが得られます)。
y=&x;
z=y
次の行*y++=*z++;
は正確には意味がなく、使用するコンパイラによってはコンパイルできる場合とできない場合があります。GCC 4.3.2 の場合、次のエラーが発生します。
foo.c:7: error: invalid operands to binary * (have ‘int *’ and ‘int *’)
ポインター演算を実行しようとしているようですが、演算子の優先順位が少し混乱しています。z
プレインクリメント値をロケーションに割り当てた後、が指す値をインクリメントしようとしていますか?
*y++=*z++; //wat does this mean?
上記は、未定義の動作 (次のシーケンス ポイントの前に複数の変更) をもたらします。