C / C ++常量

C/C++ Constants

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
const int = int const?

这些关键字组合有什么区别?

1
2
3
4
5
const int*

int const*

int* const

是否可以通过使用指针访问常量的地址来修改其值?


1
2
3
const int*

int const*

两者都声明指向常量类型int的指针。这意味着指针可以指向(保持)任何其他地址,但任何修改常量整数数据类型的尝试都将导致未定义的行为。

1
int* const

声明指向int类型的常量指针。这意味着指针不能被分配任何新的地址,它将始终指向相同的地址,但它指向的整数可以更改。

是否可以通过使用指针访问常量的地址来修改其值?

是的,这是有可能的,但它会导致一个格式不正确的程序显示出一种未定义的行为。


一般来说:

1
   const T            ===               T const

1
   const T *          ===               T const *

但是

1
   T * const

使指针变为常量,但不一定是t的内容。

1
    const T * const      ===         T const * const

将使t的内容和指针本身都成为常量。

至于改变const的内容:你不应该这样做,但是编译器/os/cpu不会太努力地阻止你,所以你得到了通俗的"未定义的行为",这是一个很好的表达"某些系统的随机崩溃"的方式。


const int*int const*都是指向常量int的指针。这意味着指向的值不能更改,但指针本身可以更改。

第三个示例int *const是指向int的常量指针。这意味着值可以更改,但指针不能更改。

是的,您可以使用指针更改地址的值,但这样做是未定义的行为,应该避免。C++还提供了const_cast来消除变量的const性。

如果你还有其他有关EDCOX1的7个关键字的问题,你应该引用C++ FAQ的const正确部分。


前两个是指向const int的变量指针。指针本身可以更改。如果不放弃const,则无法通过此指针更改int。(但是,它可以通过非常量引用进行修改。)

最后一个是指向变量int的常量指针。如果不放弃const,则无法更改指针本身。可以通过指针更改int。


常量绑定到左边。除非它是最左边的子句,否则在中约束右边。

从右向左读

1
2
3
4
5
6
7
8
9
10
11
const int*  => (const int)*  =>"pointer" to"const int"
                             => Pointer can change.
                             => Can't change the value it points at (the int is const)

int const*  => (int const)*  =>"pointer" to"const int"
                             => As above

int* const  => int (* const) =>"const pointer" to"int"
                             => Can'
t change the pointer (its const) it always points
                             => at the same things.
                             => You can change the value of the object it points at.

这可能会有所帮助。这是另一个讨论如何将其分解的部分,这样您就可以看到在各种场景中哪些部分变成了const