C を何年も使用した後でも、ポインターは依然として私を混乱させます。
これら2つは同じですか:
int *num;
someFunc(num)
と
int num;
someFunc(&num);
で変数を宣言すると*
、それがポインターに&
なり、変数が (一時的に) ポインターに変わりますか?
C を何年も使用した後でも、ポインターは依然として私を混乱させます。
これら2つは同じですか:
int *num;
someFunc(num)
と
int num;
someFunc(&num);
で変数を宣言すると*
、それがポインターに&
なり、変数が (一時的に) ポインターに変わりますか?
いいえ、それらは同じではありません。最初のケースでは、ランダムなメモリ位置を指しているポインターがあります (初期化していないため)。2 番目のケースでは、 で取得したポインターsomeFunc
は有効な場所 ( variable のアドレス) を指していますnum
。
関数呼び出しに関しては同じです。でも
違いは……。
int num
アドレスを取る実際の整数です。その後、ポインターに配置できます
int *num
は int へのポインターですが、コードをそのまま使用すると、値を保持できる実際の int を指しません。
したがって、2 番目の例だけが実際のコードです。
最初のものは次の場合に機能します...
int x;
int *num = &x;
someFunc(num)
someFunc は次のようになります
void someFunc(int *blah)
{
}
つまり、基本的にint* num = &x
は、関数呼び出しを行うときに何が起こっているかです。someFunc(&num)
つまり、効果的に実行しているだけです int* blah = &num
num
最初のケースでは、整数へのポインタであると宣言しています。2番目のケースnum
は整数です。
someFunc
関数にとって、どちらの場合も、渡される引数は整数へのポインターです。したがって、値を出力するには、逆参照する必要がありますprintf("%d\n", *num)
。
どちらの場合も、初期化していないため、値はごみになります。
お役に立てば幸いです。
FreeBSDでの更新初期化されていないポインタが想定外の場所を指している可能性があるため、最初のセグメンテーション違反が発生しました。
2 番目は integer のアドレスを渡しnum
ます。これは完全に妥当なことです。最初は、ポインターに格納されているものをすべて渡しますnum
。それはのアドレスである必要がありますint
が、あなたの例num
では初期化されておらず、アドレスはおそらくガベージを指しています(せいぜい)。
&
「変数をポインターに変える」のではなく、変数のアドレスを返す演算子です。これは、定義上、ポインターです。したがって、違いはなく、関数someFunc
はどちらの方法でもポインター値を受け取ります (最初のケースではポインター変数の値のコピーを受け取り、2 番目のケースでは の戻り値のコピーを受け取りますoperator &
)。