[ad_1]
こんにちは !
簡単な質問がありますが、キャスト タイプがどのように変更されるのか疑問に思っていました。 例えば :
#include <stdio.h> #include <stdlib.h> int main() { int *x; char *y; float *z; x = (int*)y; y = (char*)z; return 0; }
正直何か変わるのかなと思っていました。
どういう意味ですか? ポインターの演算は、ポインターが持つ値ではなく、ポインター自体に基づいています。
たとえば、ポインタ「x」が int で、char 算術 x+1 または x+i を指している場合、sizeof は「y」の型ではなく「x」の型に基づきます。
では、なぜ他の変数のキャストを変更する必要があるのでしょうか?
基本的に :
#include <stdio.h> #include <stdlib.h> int main() { int *x; char *y; x = (int*)y; x = (char*)y; return 0; }
何も変わらないはずです。
型を混合するのは良い考えではないことは承知していますが、正直に言うと、型キャストについては少し混乱していました。
PS.
型キャストの変更がどのように見えるか、いくつかの例を見つけました。
引用:*(int *)((char *)ptr + 2*sizeof(int))
ここで何が起こっているのか、なぜ ptr タイプが 2 回変更されるのかはよくわかりませんでした。 これはポインター算術に関するものですが、ptr + 1 がある場合、それは (ptr+1*sizeof(int)) であると想像しました。ここでは (char*) と別の (int*) があるので、(ptr +1*sizeof(int)) に sizeof(char) を掛けてから、sizeof(int) を掛けます ???? 奇妙な。
私が試したこと:
ポインタがアドレスを取得するだけなのに、なぜ型を変更する必要があるのに、なぜそのようになるのかを主に考えてみました。
解決策 1
ポインタに +1 を実行すると、ポインタはその型の次のアドレスに移動します。
4 バイト浮動小数点数へのポインタに +1 を実行すると、アドレスは 4 バイト増加します。
8 バイトの double へのポインタに +1 を実行すると、8 バイト上がります。
なぜ 2 つのキャストがあるのかを理解するには、括弧を確認する必要があります。
char へのキャストは、ポインター演算でカウントするサイズとして ‘1’ を使用するため、通常は行われます。
したがって、ptr を char* として扱い、次に int の 2 倍のサイズを追加します (デフォルトでは、32 ビットまたは 64 ビット システムでは 4 になります)。 これは、ptr から 8 バイトを削除した int を読み取ろうとしていることを意味します。
もっと簡単に書く方法は次のようになります
*((int *)ptr + 2)
または、ptr がすでに int* 型である場合は、単に次のようにします
*(ptr + 2)
[ad_2]
コメント