int a;
// these two are the same: pointed value mustn't be changed
// i.e. pointer to const value
const int * p1 = &a;
int const * p2 = &a;
// something else -- pointed value may be modified, but pointer cannot point
// anywhere else i.e. const pointer to value
int * const p3 = &a;
// ...and combination of the two above
// i.e. const pointer to const value
const int * const p4 = &a;
char *p = "data"; //non-const pointer, non-const data
const char *p = "data"; //non-const pointer, const data
char * const p = "data"; //const pointer, non-const data
const char * const p = "data"; //const pointer, const data
const pointer: pointed value may be modified, but pointer cannot point
anywhere else
// Just append const or pointer to
int x; // data
int const cx; // const data
int *px; // pointer to data
int const *pcx; //pointer to const data
int * const cpx; // const pointer to data
int const * const * * const cppcpcx; // const pointer to (pointer to (const pointer to const data))
// 1.
int x1 = 1;
int x2 = 2;
const int* p = &x1;
//*p = 3; // variable data is CAN NOT BE changed through pointer
p = &x2; // pointer CAN POINT to other variable
cout << *p << endl; // OUTPUT: 2
// 2.
int y1 = 1;
int y2 = 2;
int* const t = &y1;
*t = 3; // variable data is CAN BE changed through pointer
//t = &y2; // pointer CAN NOT POINT to other variable
cout << *t<<endl; // OUTPUT: 3
8条答案
按热度按时间3mpgtkmj1#
它们都是有效代码,并且都是等价的。对于指针类型,虽然它们都是有效代码,但不等价。
声明2个整数,它们是常量:
声明一个指针,该指针的数据不能通过指针更改:
声明不能更改为指向其他对象的指针:
ufj5ltwl2#
是的,它们是一样的。C++的规则本质上是
const
应用于它左边的类型。然而,有一个例外,如果你把它放在声明的最左边,它应用于类型的第一部分。例如在
int const *
中你有一个指向一个常量整数的指针,在int * const
中你有一个指向一个常量整数的指针,你可以将其外推到指针,英语可能会让人困惑,但原理是一样的。关于一种方法优于另一种方法的优点的另一个讨论,请参见my question。如果您想知道为什么大多数人使用异常,Stroustrup的FAQ条目可能会有帮助。
gg0vcinb3#
是的,完全一样。但是指针不同。我的意思是:
nxowjjhe4#
摘自“有效C++”第21项
w8ntj3qf5#
它在意义和效力上是相同的。
据我所知,const只有在涉及指针时才会变得复杂。
是不同的。
是一样的。
woobm2wo6#
我发现,如果总是把const写对,读一个复杂的指针类型会变得更容易。
例如:
kgsdhlau7#
我知道如何解释(非)常量指针和数据。用 * 分割它。
| 数据类型|星座|指针类型|合并|数据类型|指针|
| - ------| - ------| - ------| - ------| - ------| - ------|
| 整数|土耳其 *| p|整数 * p|非常数|非常数|
| 常数整数|土耳其 *| p|常量整数 * p|常数|非常数|
| 整数|土耳其 *|常数p|整数 * 常数p|非常数|常数|
| 常数整数|土耳其 *|常数p|常量整数 * 常量p|常数|常数|
ndasle7k8#