2016-09-28 36 views
1

我从C++开始,真的看不到指针的优点。 我看到很多人说指针有助于节省内存或善于进行内存管理。在这个例子中使用指针的好处?

像波纹管的例子,他们返回相同的结果,如果我在这种情况下使用指针有什么不同?

没有指针

typedef struct 
{ 
    int book_id; 
} Books; 

void printbookinf(Books book); 

int main() 
{ 
    Books bno1; 
    Books bno2; 

    bno1.book_id = 1225; 
    bno2.book_id = 3214; 

    printbookinf(bno1); 
    printbookinf(bno2); 

    return 0; 
} 
void printbookinf(Books book) 
{ 
    printf("abc %d",book.book_id); 
} 

与指针

typedef struct 
{ 
    int book_id; 
} Books; 

void printbookinf(Books *book); 

int main() 
{ 
    Books bno1; 
    Books bno2; 

    bno1.book_id = 1225; 
    bno2.book_id = 3214; 

    printbookinf(&bno1); 
    printbookinf(&bno2); 

    return 0; 
} 
void printbookinf(Books *book) 
{ 
    printf("abc %d",book->book_id); 
} 

或本

typedef struct 
    { 
     int book_id; 
    } Books; 

void printbookinf(Books *book); 

int main() 
{ 
    Books *bno1; 
    Books *bno2; 

    bno1->book_id = 1225; 
    bno2->book_id = 3214; 

    printbookinf(bno1); 
    printbookinf(bno2); 

    return 0; 
} 
void printbookinf(Books *book) 
{ 
    printf("abc %d",book->book_id); 
} 
+2

在这种情况下没有好处,而示例#3是未定义的行为。 – Cornstalks

回答

1

我看到很多人说指针有助于节省内存或善于进行内存管理。

这通常不是指针。在你的例子中,指针可以帮助你节省内存和传输数据,如果struct大于指针。

第一个示例在传递参数时复制struct。这意味着两件事情:

  • 的整体结构,甚至一个大的,会被复制,并且复制将被传递给函数
  • 在函数内部的任何修改将是无形的给调用者。

第二个例子将指针传递,所以

  • 只有指针被复制,并且
  • 变化,如果有的话,就传递给函数的原始参数进行。

你的第三个例子有未定义的行为,因为你传递的指针是未赋值的。

注意:你的问题没有询问关于引用,但有一个构造与指针非常相关,可以节省参数复制的空间,它可以让函数对原始值进行修改。在保持访问成员的点.语法时发生的所有事情,就好像它是struct,而不是指针。

+0

因此,正如我的理解,在第一个传递结构对象'bno1','bno2'将花费比第二个更多的内存? – TomSawyer

+0

@TomSawyer在你的例子中没有,因为'bno1'和'bno2'的大小更小或者等于一个指针的大小。对于较大的结构 - 比如说有三个或更多的字段,第一个例子会在自动存储中花费更多的内存。 – dasblinkenlight

-1

如果你要使用C++,这将是更好地使用标准库。这些库是高效的,隐藏了指针的复杂性(和麻烦),有时更容易调试代码。但是在某些情况下,它已经显示使用std::vector数组和指针数组产生相同的汇编代码。

+0

这个问题根本没有提及'array' –

+0

这只是一个例子。一般来说,我们主要使用数组的指针。 – user1436187