C の main() コードのこれら 2 つのバージョンの違いを知りたいと思いました。
int main() {
uint32_t a;
f(&a);
}
と
int main() {
uint32_t *a;
f(a);
}
関数の
void f(uint32_t *pointer) {
// ...
}
最初の例では、ポインターを初期化されていない variable に渡しますa
。 f()
たとえば、そこに値を保存し、main()
後でその値を使用できます。
2 番目の例では、初期化されていないポインターを渡しますa
。 f()
有用なことは何もできません。
最初のバージョンでは、初期化されていない変数へのポインターを f() に渡します。f() のタスクが変数を初期化することでない限り、しないでください。
2 番目のバージョンでは、初期化されていないポインターを関数 f() に渡します。しないでください。
初期化せずに、さまざまなタイプの変数を定義しています。
uint32_t a;
スタック上の変数を定義uint32_t
し、関数呼び出しはそのアドレスをf()
関数に渡します。
uint32_t *a;
スタック上にポインターを定義し、その値を関数に渡します。ポインタは初期化されていないため、任意のブロックを指す可能性があり、そのアドレスにアクセスしようとすると、未定義の動作が発生します。
関数の観点からは、f()
渡されたポインター値が表示されます。最初の呼び出しではそのアドレスを使用できますが、2 番目の呼び出しでは使用できません。
ポインタの質問!!!
わかりましたので、関数 f は、メモリ内の実際の場所へのアドレスとまったく同じようにポインタを取る必要があることを知っています。最初の例 (f(&a)) では、アドレスを渡す必要があります。アドレスはスタック内に存在し、実際には関数の有効期間外では共有されないためです。そのため、関数が返されると、メモリは破棄され、使用できなくなります。ポインタの値は渡されず、値へのポインタだけが渡されます。その値を変更すると、「それを指す」すべてのものが変更されるため、問題が発生する可能性があります。
2番目のものでは、ヒープまたはどこからでもメモリを取得しますが、実際の値ではなく値のアドレスを格納するため、それを操作して何も返さず、値はまだそこにあります。