2014-01-13 104 views
2

我看过代码,人们将const用作函数的参数。使用const *和const * const有什么好处?这可能是一个非常基本的问题,但如果有人能解释我会很感激。何时使用const *与const * const?

Bool IsThisNumberEqualToFive(int const * num) 
{ 
    return(Bool)(5 != num); 
} 

Bool IsThisNumberEqualToFive(int const * const num) 
{ 
    return(Bool)(5 != num); 
} 
+1

有点相关:您可能会发现[这是对以前的问题的答案](http://stackoverflow.com/questions/14562845/why-does-passing-char-as-const-char-generate-a-warning/ 14566215#14566215)有趣。与你的问题没有直接关系,所以不是愚蠢的,而是检查指针类型列表和const的效果。 – WhozCraig

回答

6
  • 在你答应你不打算去了num点写 对象
  • 在第二个版本的第一个版本,你承诺,并且还可以防止自己 (即IsThisNumber。 )从制造num指向别的东西。

也就是说,在第二个版本指针本身也是const,除了指针对象。

+0

所以在一个函数中,我们只需要检查一个语句是否为真(我们没有改变函数内部的任何东西),我们应该使用第二个选项? – user968000

+0

从技术上讲,它允许编译器优化更多。实际上,你更关心指针级别的const。 – cnicutar

+1

@ user968000就我个人而言,我认为像第二个函数中的顶级'const'几乎毫无价值。有人调用该函数并不关心你是否在函数内执行'++ num;',但他们更可能在意你不会执行'* num = 42;',第一个版本承诺你赢了“T。 – Praetorian

2

对于参数

int const * num // num is a pointer to const int. 

const为保护num点to.The编程可以改变的num但不*num的值。虽然

int const * const num // num is a const pointer to const int 

最左边const是保护num点,而最右边的是保护指针num它的自我。在这种情况下,num*num都不会修改。

注:了解什么呢

T const *p; // T is any valid type 

手段(更精确)。
这意味着,程序可以使用表达式p来更改指定对象的指针对象的值,但它不能使用表达式*p来更改*p可能指定的任何对象的值。 如果程序有另一个表示e的非限定类型,指定*p也指定的对象,程序仍然可以使用e来更改该对象

+0

@ViktorLexington;在第一种情况下,可以改变指针而不是指针指向的值。对于第二个例子,你是对的。 – haccks

1

越多,消息来源告诉什么会happend给变量的值,编译器(或更好‘发生’,因为它会被预期const变量)提前好编译器可以optmise。