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

C语言中的直接调用与间接调用,c,pointers,comparison,invocation,indirection,C,Pointers,Comparison,Invocation,Indirection,我是C语言的新手,我在读指针如何“指向”另一个变量的地址。因此,我尝试了间接调用和直接调用,并收到了相同的结果(正如任何C/C++开发人员所预测的)。这就是我所做的: int cost; int *cost_ptr; int main() { cost_ptr = &cost; //assign pointer to cost cost = 100; //in

我是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),它仍然在编译时没有返回语句,一切都如预期的那样。也许因为C++编译器会自动插入返回语句,如果忘记了。

< p>在“PrtTf(…,*-Cube)”的情况下,“成本”的值被复制到栈中。在这个例子中,如果你调用一个不同的函数,并且“CaseTpTR”指向一个多兆字节的数据结构,那么假设“P/t> < P>”,在PrINTF(…,*成本)中在这种情况下,“cost”的值被复制到堆栈中。虽然在本例中很简单,但想象一下,如果您调用的是另一个函数,并且“cost_ptr”指向一个多兆字节的数据结构。

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

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


但是,有时只有指针允许您执行所需操作。不要被差异所困扰,在你需要的时候使用指针。但是在不需要指针的时候要避免使用它们。

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

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


但是,有时只有指针允许您执行所需操作。不要被差异所困扰,在你需要的时候使用指针。但是在不需要指针的时候要避免它们。

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

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

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

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

      问题是……?“所以我想知道使用指针的间接调用是否比直接调用有任何优势,反之亦然。”我给它添加了一个实际的问号。指针不是魔法。如果您了解使用指针时发生的情况,您应该能够回答自己的问题。顺便说一句,“调用”与“访问”不同。前者适用于调用代码,后者适用于任何类型的使用。在这种情况下,您可能想要“访问”。问题是……?“所以我想知道使用指针的间接调用是否比直接调用有任何优势,反之亦然。”我给它添加了一个实际的问号。指针不是魔法。如果您了解使用指针时发生的情况,您应该能够回答自己的问题。顺便说一句,“调用”与“访问”不同。前者适用于调用代码,后者适用于任何类型的使用。在这种情况下,您可能想要“访问”。在C中没有“堆栈”,请按其等效存储持续时间引用这些术语,在本例中为自动。在C中没有“堆栈”,请按其等效存储持续时间引用这些术语,在本例中为自动。