2016-09-14 62 views
0

我已阅读this在维基百科(粘贴以下为好):C/C++对指针公约和`const`

按照对声明通常的C惯例,声明如下使用,并且在指针*是写在指针上,指示解引用。例如,在声明int * ptr中,解引用的形式* ptr是一个int,而参考形式ptr是一个指向int的指针。 因此,const修改名称为。相反,C++约定将*与类型关联,如int * ptr,并将const作为修改类型的左边来读取。 int const * ptrToConst因此可以被读为“* ptrToConst是一个int常量”(该值是常量),或者“ptrToConst是一个int常量*”(指针是一个指向常量整数的指针)。

我真的很没能得到一个满意的解释:

  • 在这意义上它修改?

  • 什么打算与 VS (见上面的链接)?

  • 为什么它应该在const的右侧?

+0

该链接并不会导致任何地方有用。 – molbdnilo

+1

我只是修复了这个链接。 –

+1

该wikipedia部分感到困惑。如果例子是'const int * ptrToConst;'和'const int * const constPtrToConst;' – user3386109

回答

1

在这意义上它修改?

修改的意思是它使它保持不变,这意味着它不能被修改(赋值或传递给可能修改它的函数)。

什么意图与名称与类型(见上面的链接)?

名字的意思是在这里写的源代码中的词,我认为。

为什么它应该在const的右侧?

“修饰名右”的方式,通过例如:

const char * str,这里常量修改焦炭,换句话说,字符常量,则无法修改它们。你可以让str指向一个新的字符,但是你仍然不能修改它(至少不能通过str)。 *str = 'a';是编译器错误,str = "foo";没问题。

char * const str,这里常量修改STR,换句话说STR的值不能被修改。它指向某些字符,并且您可以通过str修改该字符,但不能使str指向另一个字符。*str = 'a';现在可以,str = "foo";是错误的。

+0

非常感谢你们。我通过维基百科的引用部分走出我的头脑。一些事实,我已经正确推断与其他Stackoverf的帮助。线程..但最多(例如左/右)我真的没有。感谢用户,特别是Shankar的评论。两个答案也很好:我将所有的两个答复标记为答案。我不能,所以我先按照时间顺序排列。 – Bento

5

constvolatilerestrict(C99起)关键字都被认为类型限定符。它们是类型签名不可分割的组成部分,并描述了有关类型的附加语义。

如果它们出现在一个声明的最上层,它们会影响声明标识符:

const int a = 5; // prevents modifications of "a" 
int *const p = &x; // prevents modifications of "p", but not "*p" 
int **const q = &y; // prevents modifications of "q", but not "*q" and "**q" 

如果它们出现在指针亚型(星号之前),因为它们影响到指向的在特定值提领的水平:

const int *p = &x; // prevents modifications of "*p", but not "p" 
const int **q = &y; // prevents modifications of "**q", but not "*q" and "q" 
const int *const *r = &z; // prevents modifications of "**r" and "*r", but not "r" 
const int *const *const s = &a; // prevents modifications of "**s", "*s" and "s" 

的维基百科摘录讨论了声明指针两种不同的约定:

int *p; // more common in C programming 
int* p; // more common in C++ programming 

我会说“真”约定是第一个,因为它根据语言的语法(声明镜像使用)工作。该声明中的星号实际上是与正常表达式中的指针相同的解引用操作符。因此,在p(指针本身)上应用*(间接)后,返回int类型。

还要注意的是类型限定符相对于排序,以类型说明符和其他类型的预选赛没有关系,所以这些声明是等价的:

const int a; // preferred 
int const a; // same, not preferred 

const volatile int b; // preferred 
volatile const int b; // same, not preferred 
volatile int const b; // same, not preferred 

const int *p; // preferred 
int const *p; // same, not preferred