const int*、const int * const 和 int const * 有什么区别?

2022-01-31 00:00:00 pointers c constants c++ c++-faq

我总是搞砸如何正确使用 const int*const int * constint const *.是否有一套规则来定义你能做什么和不能做什么?

I always mess up how to use const int*, const int * const, and int const * correctly. Is there a set of rules defining what you can and cannot do?

我想知道在分配、传递给函数等方面的所有注意事项.

I want to know all the do's and all don'ts in terms of assignments, passing to the functions, etc.

推荐答案

向后阅读(由 顺时针/螺旋规则):

  • int* - 指向 int 的指针
  • int const * - 指向 const int 的指针
  • int * const - 指向 int 的 const 指针
  • int const * const - 指向 const int 的 const 指针
  • int* - pointer to int
  • int const * - pointer to const int
  • int * const - const pointer to int
  • int const * const - const pointer to const int

现在第一个 const 可以在类型的任一侧,所以:

Now the first const can be on either side of the type so:

  • const int * == int const *
  • const int * const == int const * const
  • const int * == int const *
  • const int * const == int const * const

如果你真的想发疯,你可以这样做:

If you want to go really crazy you can do things like this:

  • int ** - 指向 int 的指针
  • int ** const - 一个指向 int 指针的 const 指针
  • int * const * - 指向 const 的指针,指向 int 的指针
  • int const ** - 一个指向 const int 的指针
  • int * const * const - 一个 const 指针,指向一个 const 指针,指向一个 int
  • ...
  • int ** - pointer to pointer to int
  • int ** const - a const pointer to a pointer to an int
  • int * const * - a pointer to a const pointer to an int
  • int const ** - a pointer to a pointer to a const int
  • int * const * const - a const pointer to a const pointer to an int
  • ...

为了确保我们清楚 const 的含义:

And to make sure we are clear on the meaning of const:

int a = 5, b = 10, c = 15;

const int* foo;     // pointer to constant int.
foo = &a;           // assignment to where foo points to.

/* dummy statement*/
*foo = 6;           // the value of a can′t get changed through the pointer.

foo = &b;           // the pointer foo can be changed.



int *const bar = &c;  // constant pointer to int 
                      // note, you actually need to set the pointer 
                      // here because you can't change it later ;)

*bar = 16;            // the value of c can be changed through the pointer.    

/* dummy statement*/
bar = &a;             // not possible because bar is a constant pointer.           

foo 是一个指向常量整数的变量指针.这使您可以更改指向的内容,但不能更改指向的值.最常见的情况是 C 风格的字符串,其中有一个指向 const char 的指针.您可以更改指向的字符串,但不能更改这些字符串的内容.当字符串本身位于程序的数据段中并且不应更改时,这一点很重要.

foo is a variable pointer to a constant integer. This lets you change what you point to but not the value that you point to. Most often this is seen with C-style strings where you have a pointer to a const char. You may change which string you point to but you can't change the content of these strings. This is important when the string itself is in the data segment of a program and shouldn't be changed.

bar 是指向可以更改的值的常量或固定指针.这就像一个没有额外语法糖的参考.由于这个事实,通常你会使用一个引用来使用 T* const 指针,除非你需要允许 NULL 指针.

bar is a constant or fixed pointer to a value that can be changed. This is like a reference without the extra syntactic sugar. Because of this fact, usually you would use a reference where you would use a T* const pointer unless you need to allow NULL pointers.

相关文章