const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的,但本质上还是变量。
int main()
{
int a = 10;
a=20;
}
int main()
{
const int a = 10;
a = 20; // 不可行
}
而使用指针变量时,发现可以通过指针将a的值改变
int main()
{
int a = 10 ;
int* p = &a; // 将a的地址存放在p中, p是变量名,*p代表p是指针变量,int表示它所指向的对象是int类型
*p = 20; // 可行
}
当用const修饰指针时,const放在不同的位置,会有不同的效果
1.const放在 *前, 修饰 *p
int main()
{
int a = 10 ;
const int* p = &a;
// 或者写成 int const * p = &a;
*p = 20; // 不可行 , const放在 * 前面,修饰的是 *p,*p代表对p解引用找到a(也就是说 *p=a),而*p受到限制不能改变,则也不能通过这种方法改变a。
}
const限制 *p时,并没有对p限制,也就是说,此时我们可以改变p的值,使p存放其他变量的地址
int main()
{
int a = 10 ;
int b = 5;
const int* p = &a;
// 或者写成 int const * p = &a;
*p = 20; // 不可行
p = &b // 可行
}
2. const放在 * 后,修饰p
int main()
{
int a = 10 ;
int b = 5;
int* const p = &a; // 此时const修饰的是 p
*p = 20; // 可行
p = &b // 不可行 // 则p不能发生改变
}
总结就是 const修饰变量时,要分清修饰的是指针变量 p,还是 指针变量所指向的内容 *p
放在 * 前 , 修饰限制的 是 *p(解引用后指向的变量),则这个变量(指针指向的内容)不能被改变,而指针变量本身不受到限制。
放在 * 后, 修饰限制的是 p(指针变量时),指针变量不能发生改变,是谁的地址就是谁的地址。 但指针变量的内容(指向的变量)可以发生改变。
同样,当写成 int const * const p = &a;时 二者都不能发生改变。