1

私はCを初めて使用し、ポインターが別の変数のアドレスを「指す」方法について読んでいました。そのため、間接呼び出しと直接呼び出しを試しましたが、同じ結果が得られました(C / C ++開発者なら誰でも予測できたはずです)。これは私がしたことです:

int cost;
int *cost_ptr;

int main()
{
    cost_ptr = &cost;                          //assign pointer to cost
    cost = 100;                                //intialize cost with a value
    printf("\nDirect Access: %d", cost);
    cost = 0;                                  //reset the value
    *cost_ptr = 100;
    printf("\nIndirect Access: %d", *cost_ptr);
    //some code here

    return 0;                                  //1
}

だから私は、ポインタを使った間接的な呼び出しが直接的な呼び出しよりも利点があるのか​​、またはその逆なのか疑問に思っていますか?いくつかの長所/短所には、速度、操作を実行するために消費されるメモリの量(おそらく同じですが、私はそれをそこに出したかっただけです)、安全性(ダングリングポインタなど)、優れたプログラミング手法などが含まれ
ます。 GNU Cコンパイラ(gcc)を使用しても、returnステートメントなしでコンパイルされ、すべてが期待どおりに実行されます。おそらく、C ++コンパイラは、忘れた場合にreturnステートメントを自動的に挿入するためです。

4

3 に答える 3

6

間接呼び出しと直接呼び出しは、さまざまな場所で使用されます。サンプルでは、​​直接呼び出しが優先されます。ポインタを使用するいくつかの理由:

  • 大きなデータ構造を関数に渡す場合、データ構造全体をコピーする代わりにポインターを渡すことができます。
  • 関数が呼び出し元の関数の変数を変更できるようにする場合は、元の変数へのポインターを渡す必要があります。値で渡すと、呼び出された関数はコピーを変更するだけです。
  • コンパイル時に渡す値が正確にわからない場合は、実行時に適切な値へのポインターを設定できます。
  • メモリのブロックを動的に割り当てるときは、実行時まで保存場所がわからないため、ポインタを使用する必要があります。
于 2010-04-04T17:59:33.773 に答える
1

ポインタ表記には2つのメモリフェッチ(または1つのフェッチと1つの書き込み)が含まれ、直接呼び出しには1つが含まれます。

メモリアクセスは遅いので(レジスタでの計算と比較して、ディスクでのアクセスと比較して速い)、ポインタアクセスは物事を遅くします。

ただし、ポインタだけで必要なことを実行できる場合があります。違いにとらわれず、必要なときにポインタを使用してくださいただし、ポインタが不要な場合は避けてください。

于 2010-04-04T17:57:55.820 に答える
0

「printf(...、* cost)」の場合、「cost」の値がスタックにコピーされます。この例では些細なことですが、別の関数を呼び出していて、「cost_ptr」がマルチメガバイトを指している場合を想像してみてください。データ構造。

于 2010-04-04T17:54:50.443 に答える