在为堆栈中的变量声明指针时有什么意义吗?

时间:2010-06-04 19:38:17

标签: c pointers

 void my_cool_function() 
 {
   obj_scene_data scene;
   obj_scene_data *scene_ptr = &scene;
   parse_obj_scene(scene_ptr, "test.txt");
 }

为什么我会像上面那样创建一个指向本地变量的指针

 void my_cool_function() 
 {
   obj_scene_data scene;
   parse_obj_scene(&scene, "test.txt");
 }

以防万一相关:      int parse_obj_scene(obj_scene_data * data_out,char * filename);

5 个答案:

答案 0 :(得分:5)

在你链接的特定代码中,没有什么理由。

如果你有一个obj_scene_data **函数,那么在功能上可能是必要的。你不能做&&scene,所以在传递地址之前你必须创建一个局部变量。

答案 1 :(得分:4)

是的,你可以出于多种原因这样做。

例如,如果要通过指针迭代堆栈分配数组的成员。

或者在其他情况下,如果您想有时指向一个内存地址,有时指向另一个内存地址。您可以通过if语句设置指向一个或另一个的指针,然后在同一范围内使用您的公共代码。

通常在这些情况下,指针变量超出范围,同时堆栈分配的内存超出范围。如果在同一范围内使用指针,则没有任何害处。

在您的确切示例中,没有充分理由这样做。

答案 2 :(得分:1)

如果函数接受NULL指针作为输入,并且您想根据某些条件决定是否传递NULL,那么指向堆栈变量的指针对于避免必须在单独的代码路径中调用相同的函数很有用,尤其是如果其余参数相同则不然。例如,而不是:

void my_function()  
{ 
    obj_data obj = {0}; 
    if( some condition )
        other_function(&scene, "test.txt"); 
    else
        other_function(NULL, "test.txt"); 
} 

你可以这样做:

void my_function()  
{ 
    obj_data obj = {0}; 
    obj_data *obj_ptr = (condition is true) ? &obj : NULL;
    other_function(obj_ptr, "test.txt"); 
} 

答案 3 :(得分:0)

如果parse_obj_scene()是一个函数,则没有充分的理由创建单独的指针。但是,如果由于某种不合理的原因它是宏,可能需要将值重新分配给指针以迭代主题数据。

答案 4 :(得分:0)

不是在语义方面,实际上有一个更普遍的观点,即您可以使用函数调用替换所有局部变量而不改变语义,并且给定合适的编译器优化,效率相同。 (见"Lambda: The Ultimate Imperative"第2.3节。)

但是编写代码与下一个人进行通信以维护它的重点,以及在没有尾调用优化的命令式语言中,通常使用局部变量来迭代,自动结构和简化表达式。因此,如果它使代码更具可读性,那就使用它。