1. ホーム
  2. c

[解決済み] (uint32_t*)とは何ですか?

2022-03-01 04:52:39

質問

理解するのに苦労しています *(uint32_t*) .

持っているとしよう。

uint32_t* ptr;
uint32_t num
*(uint32_t*)(ptr + num); // What does this do? Does it 

解決方法は?

uint32_t は32ビットを保証する数値型です。値は符号なし、つまり0から2までの範囲になります 32 - 1.

この

uint32_t* ptr;

型のポインタを宣言しています。 uint32_t* しかし、そのポインタは初期化されていない、つまり つまり、そのポインタは特定の場所を指していないのです。このポインタを通してメモリにアクセスしようとすると、未定義の動作が発生し、プログラムがクラッシュする可能性があります。

これは

uint32_t num;

は単なる型変数で uint32_t .

これは

*(uint32_t*)(ptr + num);

ptr + num は新しいポインタを返します。これはポインタ演算と呼ばれるものです。普通の算術と同じですが、コンパイラが型の大きさを考慮するのが特徴です。 を考慮しています。例えば ptr + num をベースにしたメモリアドレスとして、元の ptr のバイト数を加えたポインタを使用します。 num uint32_t オブジェクトを作成します。

(uint32_t*) x はキャストです。これは、コンパイラが式 x であるかのように uint32_t* . この場合、必要ないくらいです。 なぜなら ptr + num はすでに uint32_t* .

* はデリファレンス演算子で、ポインタを介してメモリにアクセスするために使用されます。式全体は次の式と等価である。

ptr[num];

さて、これらの変数はどれも初期化されていないため、結果はゴミとなります。

しかし、このように初期化すると

uint32_t arr[] = { 1, 3, 5, 7, 9 };
uint32_t *ptr = arr;
uint32_t num = 2;

printf("%u\n", *(ptr + num));

これは5と表示されます。 ptr[2] は5です。