直接调用与C中的间接调用

时间:2010-04-04 17:42:37

标签: c pointers comparison invocation indirection

我是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
}

所以我想知道带指针的间接调用是否比直接调用有任何优势,反之亦然?一些优点/缺点可能包括速度,执行操作所消耗的内存量(很可能是相同的)但我只是想把它放在那里),安全(如悬挂指针),良好的编程习惯等 1 有趣的是,我使用的是GNU C编译器(gcc),它仍然在没有return语句的情况下编译,一切都如预期的那样。也许是因为如果你忘了,C ++编译器会自动插入return语句。

3 个答案:

答案 0 :(得分:6)

间接和直接调用用于不同的地方。在您的示例中,首选直接调用。使用指针的一些原因:

  • 将大型数据结构传递给函数时,可以传递指针而不是复制整个数据结构。
  • 如果希望函数能够修改调用函数中的变量,则必须将指针传递给原始变量。如果按值传递它,被调用函数将只修改副本。
  • 如果您不确切地知道在编译时要传递哪个值,则可以在运行时设置指向正确值的指针。
  • 当动态分配内存块时,必须使用指针,因为直到运行时才知道存储位置。

答案 1 :(得分:1)

指针表示法涉及两次内存提取(或一次提取和一次写入),其中直接调用涉及一次。

由于内存访问速度慢(与寄存器中的计算相比;与磁盘上的访问相比速度快),指针访问会减慢速度。

但是,有时候只有一个指针可以让你做你需要的。不要挂断差异,在需要时使用指针。但是,如果没有必要,请避免使用指针。

答案 2 :(得分:0)

在“printf(...,* cost)”的情况下,“cost”的值被复制到堆栈。虽然在这个例子中是微不足道的,但想象一下你是否正在调用一个不同的函数并且“cost_ptr”指向一个数兆字节的数据结构。