指针和&符号在C ++中用const表示

时间:2013-01-09 03:57:01

标签: c++ pointers const

  

可能重复:
  Declaring pointers; asterisk on the left or right of the space between the type and name?

我一直想知道放置*&的确切位置是什么。似乎C ++对于放置这些标记的位置非常宽容。 例如,我似乎将指针和&符号放在关键字的左右两侧或两个关键字的中间,但有时令人困惑的是它们似乎意味着相同的东西,特别是与const一起使用时

void f1(structure_type const& parameter)
void f2(structure_type const &parameter)

void f2(structure_type  const *sptr);
void f2(structure_type  const* sptr);
void f2(structure_type  const * sptr);

这些例子并非详尽无遗。我在声明或传递给函数时到处看到它们。他们甚至意味着同样的事情吗?但我也看到一些情况,而放*会影响哪个对象被称为指针(可能是两个关键字之间*的情况)。

编辑:

int const *Constant
int const * Constant // this above two seem the same to me, both as pointer to a constant value
int const* Constant //  EDIT: this one seems the same as above. instead of a constant pointer

const int * Constant // this is also a pointer to a constant value, but the word order changed while the pointer position stays the same, rather confusing.

int* const Constant
int * const Constant // instead, these two are constant pointers

所以我得出结论:

T const* p; // pointer to const T
const T* p  // seems same from above
T* const p; // const pointer to T

尽管如此,这让我感到很困惑。编译器不关心位置和它们所需的间距吗?

编辑: 我想知道一般情况。如果是,在什么情况下。

3 个答案:

答案 0 :(得分:13)

空白区域的重要性在于它使标记不能一起运行(例如)创建单个标记,因此(例如)int x明显不同于intx

当您处理类似int const*x;之类的内容时,*的任何一个大小的空格都与编译器完全没有区别。

pointer to const intconst pointer to int之间的差异取决于const *的哪一侧。

int const *x;    // pointer to const int
int *const x;    // const pointer to int

主要区别在于/如果您在同一声明中定义/声明多个对象,则可读性。

int* x, y;
int *x, y;

在第一个中,有人可能会认为x和y是指向int的指针 - 但事实上,x是指向int的指针,y是int。对某些人来说,第二个更准确地反映了这个事实。

防止任何误解的一种方法是一次只定义一个对象:

int *x;
int y;

对于其中任何一个,如果你完全忽略空格,那么正确的解释是相当容易的(除了告诉你哪一个toke结束而另一个开始,所以你知道“const int”是两个标记)并从右到左阅读,阅读*作为“指针”。例如:int volatile * const x;被读作“x是指向volatile int的const指针”。

答案 1 :(得分:2)

int const *Constant
int const * Constant 
int const* Constant

以上所有都打算声明一个指向常量整数的非常量指针。

简单规则:

如果const后面的*适用于指针,则{{1}}如果不适用于指针对象。间距无关紧要。

答案 2 :(得分:-2)

两者兼有和*变量声明中的展示位置是可以接受的,只取决于您自己的风格。它们严格意味着相同的东西,分别创建一个指针和一个引用。

然而,const关键字展示位置是原始的,因为int const* variable声明指向非常数 int的常量指针,const int* variable是指向常量 int。

非常量指针