const int*、const int * const 和 int const * 的区别
int const*
int const*
是指向常量整数的指针
这意味着被声明的变量是一个指针,指向一个常量整数。 实际上,这意味着指针指向一个不应更改的值。 const
限定符在这种情况下不会影响指针,因此允许指针指向其他地址。
第一个 const
关键字可以位于数据类型的任意一侧,因此 int const*
等效于 const int*
。
#include <stdio.h>
int main(){
const int q = 5;
int const* p = &q;
//Compilation error
*p = 7;
const int q2 = 7;
//Valid
p = &q2;
return 0;
}
int *const
int *const
是一个指向整数的常量指针。
这意味着被声明的变量是一个指向整数的常量指针。 实际上,指针不应该指向其他地址。 const
限定符在这种情况下不影响整数的值,因此允许存储在地址中的值更改。
#include <stdio.h>
int main(){
const int q = 5;
//Compilation error
int *const p = &q;
//Valid
*p = 7;
const int q2 = 7;
//Compilation error
p = &q2;
return 0;
}
const int* const
const int* const
是指向常量整数的常量指针。
这意味着被声明的变量是一个指向一个常量整数的常量指针。 实际上,这意味着一个常量指针指向一个常量值。 因此,指针不应指向新地址,所指向的值也不应更改。第一个 const
关键字可以位于数据类型的任一侧,因此 const int* const
等价于 int const* const
。
#include <stdio.h>
int main(){
const int q = 5;
//Valid
const int* const p = &q;
//Compilation error
*p = 7;
const int q2 = 7;
//Compilation error
p = &q2;
return 0;
}
内存映射
记住语法的一种方法(根据 Bjarne Stroustrup 的说法)是螺旋规则:规则说,从变量名开始,顺时针移动到下一个指针或类型。 重复直到表达式结束。
该规则也可以看作是从右到左解码语法。
因此,
int const*
是指向 const int
的指针;
int *const
是指向 int 的 const
指针;
int const* const
是指向 const int 的 const
指针;
使用这个规则,即使是复杂的声明也可以像这样解码 –
int ** const
是指向int
指针的const
指针。int * const *
是一个指向const
的指针,指向一个int
。int const **
是一个指向const int
的指针。int * const * const
是一个指向int
的const
指针的const
指针。