初值
因为const修饰变量时,变量不可更改,所以一定要给变量初始化
写法
下面两种写法作用是一样的,都是修饰局部变量,使number的值不可更改
const int number = 2;
int const number = 2;
当常量遇到指针
分享一下个人理解指针的小技巧:
*
右边代表指针本身的属性,*
左边代表指针指向的内容的属性。在一个操作系统中,指针本身的数据类型总是固定的,所以并不需要像其他变量一样有本身的类型说明,只需要命名就好了,所
*
右边往往只有指针的名字。但指针指向的变量,需要指定变量的类型,所以*
左边往往是指向的变量的类型。
用这个技巧来理解一下指针常量和常量指针吧
指针常量——指针是常量:指针,本身不可变
int * const n;
int a = 5;
int * const n = &a;
// ok
a = 6;
// ok
*n = 6;
int b = 6;
//error;
n = &b;
常量指针——常量的指针:指针,指向的内容有const属性,本身可变
const int * n;
int const * n;
注意:这里说的指向的内容有const属性
仅仅是指通过这个指针不可改变其内容
int a = 5;
const int * n = &a;
// ok
a = 6;
// error
*n = 6;
int b = 6;
// ok
n = &b;
指向常量的指针常量:指针,指向的内容有const属性,本身不可变
const int * const n;
int a = 5;
const int * const n = &a;
// ok
a = 6;
// error
*n = 6;
int b = 6;
// error
n = &b;
赋值时的雷区
没有被const修饰的变量可以赋值给被const修饰的变量;
char a;
// ok
const char b = a;
没有被const修饰的变量的指针可以赋值给被const修饰的变量的指针;
char *ptr;
// ok
const char *p = ptr;
char **ptr;
//ok
char * const *p = ptr;
指针类型不同不可赋值;
char **ptr; // char *类型的指针
// error
const char **p = ptr; // const char *类型的指针
当常量遇到函数
常量指针作为参数
void func(int *a, const int *b);
函数内部不能修改参数b,通常情况下,a为输出参数,b为输入参数
指针常量作为参数
void func(int *const a, int *const b);
参数a,参数b指向的地址不可修改
常量指针作为返回值
const int *func();
返回值指向的内容不可修改,返回值只能赋值同类型的常量指针
update at 2017/9/20
by 一颗球