const是C语言中的一个关键字,其所修饰的变量或者对象的值是不允许被修改的。
1、const int 和 int const
const int 和 int const的作用完全一致,无任何区别,都是表示其所修饰的变量的值禁止被修改。
2、const int*
const int* 修饰的指针,其指向的地址(即指针变量的值)可以修改,但所指向地址存储的值不能被修改。
int a = 1, b = 2;
const int* p;
p = &a;
p = &b; // 指针指向的地址可以改变
*p = 3; // 错误;指向地址存储的值不可以被修改
3、int const*
int const* 修饰的指针,其指向的地址(即指针变量的值)可以修改,但所指向地址的值不能被修改。
int a = 1, b = 2;
int const* p;
p = &a;
p = &b; // 指针指向的地址可以改变
*p = 3; // 错误;指向地址存储的值不可以被修改
4、int *const
int *const 修饰的指针,其指向的地址(即指针变量的值)不可以修改,但所指向地址存储的值可以被修改。
int a = 1, b = 2;
int* const p=&a; // int *const修饰的指针必须声明的同时就初始化,不允许声明和初始化分开进行。
*p = 3; // 指向地址存储的值可以被修改
p = &b; // 错误;地址不可以改变
5、const int *const
const int *const 修饰的指针,其指向的地址,以及指向地址的值,均不可以被修改。
int a = 1, b = 2;
const int *const p = &a; // const int *const修饰的指针必须声明的同时就初始化,不允许声明和初始化分开进行。
p = &b; // 错误;地址不可以改变
*p = 3; // 错误;所指向的值不可以改变
这里,针对const指针的情况可以总结下规律,即针对p、*p,const关键字紧挨着谁,就表示修饰的是谁。
const int *p、int const *p中,const均紧挨着*p,因此const修饰的是*p,因此p的值可以改变,但*p的值不能修改;
int *const p,const紧挨着p,因此const修饰的是p,因此p的值不可以改变,但*p的值可以改变;
const int *const则表示p、*p均不能被改变。
注:单个const,不存在const *int写法;双const,不存在const *int const写法,即*号永远只能出现在类型int后面,不能出现在其前面。
问,双const的情况下,是否存在const const int*、const int const*的写法,其代表何种含义?
注意,const int const*和int const*的含义一致,也即int const*前面无论加多少个const,都是一个意思,你完全可以定义出一个指针const const const const int const *p。
同理,你也可以定义出一个指针const const const const int const *p。
const int、int const、const int*、int const*、int *const、const int *const
原文:https://www.cnblogs.com/programmer-home/p/12925917.html