【解決方法】別の型にキャストすると大きく変わりますか?


こんにちは !

簡単な質問がありますが、キャスト タイプがどのように変更されるのか疑問に思っていました。 例えば ​​:

#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)

コメント

タイトルとURLをコピーしました