为了账号安全,请及时绑定邮箱和手机立即绑定

const int *,const int * const和int const *之间有什么区别?

const int *,const int * const和int const *之间有什么区别?

鸿蒙传说 2019-05-25 15:51:57
const int *,const int * const和int const *之间有什么区别?我总是搞砸了怎么用const int*,const int * const和int const *正确的。是否有一套规则定义了您能做什么和不能做什么?我想知道在任务,传递到职能等方面所做的所有事情和所有不应做的事情。
查看完整描述

4 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

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

  • int* - 指向int的指针

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

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

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

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

  • const int * == int const *

  • const int * const == int const * const

如果你想变得非常疯狂,你可以做这样的事情:

  • int ** - 指向int的指针

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

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

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

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

  • ...

并确保我们清楚const的含义

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

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

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


查看完整回答
反对 回复 2019-05-25
?
心有法竹

TA贡献1866条经验 获得超5个赞

我想这里已经回答了所有问题,但我只想补充一点,你应该小心typedefs!它们不仅仅是文本替换。

例如:

typedef char *ASTRING;const ASTRING astring;

类型astringchar * const,而不是const char *。这是我总是倾向于放在const类型右侧的一个原因,而不是从一开始。


查看完整回答
反对 回复 2019-05-25
?
慕后森

TA贡献1802条经验 获得超5个赞

几乎所有人都指出:

有什么区别const X* pX* const pconst X* const p

你必须从右到左阅读指针声明。

  • const X* p 表示“p指向一个常数为X的X”:不能通过p更改X对象。

  • X* const p 表示“p是指向非const的X的const指针”:您不能更改指针p本身,但可以通过p更改X对象。

  • const X* const p 表示“p是指向X的常量指针”:您不能更改指针p本身,也不能通过p更改X对象。


查看完整回答
反对 回复 2019-05-25
?
ITMISS

TA贡献1871条经验 获得超8个赞

  1. 常量参考:

    对变量(此处为int)的引用,它是常量。我们主要将变量作为引用传递,因为引用的大小小于实际值,但是存在副作用,这是因为它就像实际变量的别名。我们可能会通过完全访问别名来意外更改主变量,因此我们将其设置为常量以防止此副作用。

    int var0 = 0;const int &ptr1 = var0;ptr1 = 8; // Errorvar0 = 6; // OK
  2. 常量指针

    一旦常量指针指向变量,它就不能指向任何其他变量。

    int var1 = 1;int var2 = 0;int *const ptr2 = &var1;ptr2 = &var2; // Error
  3. 指向常数的指针

    一个指针,通过它可以不改变它指向的变量的值,这个指针称为指向常量的指针。

    int const * ptr3 = &var2;*ptr3 = 4; // Error
  4. 指向常量的常量指针

    指向常量的常量指针是一个指针,既不能改变它指向的地址,也不能改变保存在该地址的值。

    int var3 = 0;int var4 = 0;const int * const ptr4 = &var3;*ptr4 = 1;     // Error
     ptr4 = &var4; // Error


查看完整回答
反对 回复 2019-05-25
  • 4 回答
  • 0 关注
  • 1449 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信