私のプログラムは以下のとおりです。
#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の代わりに使用する必要があります%dyとzはポインタであり、式y++とz++は接尾辞演算子を使用しているため、両方の増分は代入後に発生します。
このステートメントは3つのことを行います。
y:が指すのと同じ値が指す値に割り当てzます*y = *z。yポインタをインクリメントします。ここで、メモリ内の次yを指します。 intzポインタをインクリメントします。ここで、メモリ内の次zを指します。 int最後の2つは、ステートメントの後に使用された場合はy不適切です。そして、コードに属していない初期化されていないメモリを指します。zyz
*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?
上記は、未定義の動作 (次のシーケンス ポイントの前に複数の変更) をもたらします。