0

C を何年も使用した後でも、ポインターは依然として私を混乱させます。

これら2つは同じですか:

int *num;
someFunc(num)  

int num;
someFunc(&num);

で変数を宣言すると*、それがポインターに&なり、変数が (一時的に) ポインターに変わりますか?

4

5 に答える 5

2

いいえ、それらは同じではありません。最初のケースでは、ランダムなメモリ位置を指しているポインターがあります (初期化していないため)。2 番目のケースでは、 で取得したポインターsomeFuncは有効な場所 ( variable のアドレス) を指していますnum

于 2012-04-16T04:32:03.320 に答える
2

関数呼び出しに関しては同じです。でも

違いは……。

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

于 2012-04-16T04:33:17.180 に答える
1

num最初のケースでは、整数へのポインタであると宣言しています。2番目のケースnumは整数です。

someFunc関数にとって、どちらの場合も、渡される引数は整数へのポインターです。したがって、値を出力するには、逆参照する必要がありますprintf("%d\n", *num)

どちらの場合も、初期化していないため、値はごみになります。

お役に立てば幸いです。

FreeBSDでの更新初期化されていないポインタが想定外の場所を指している可能性があるため、最初のセグメンテーション違反が発生しました。

于 2012-04-16T04:36:35.090 に答える
1

2 番目は integer のアドレスを渡しnumます。これは完全に妥当なことです。最初は、ポインターに格納されているものをすべて渡しますnum。それのアドレスである必要がありますintが、あなたの例numでは初期化されておらず、アドレスはおそらくガベージを指しています(せいぜい)。

于 2012-04-16T04:31:48.983 に答える
1

&「変数をポインターに変える」のではなく、変数のアドレスを返す演算子です。これは、定義上、ポインターです。したがって、違いはなく、関数someFuncはどちらの方法でもポインター値を受け取ります (最初のケースではポインター変数の値のコピーを受け取り、2 番目のケースでは の戻り値のコピーを受け取りますoperator &)。

于 2012-04-16T04:31:56.173 に答える