理解C语言const

初值

因为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 一颗球

posted @ 2017-09-20 21:01  一棵球和一枝猪  阅读(261)  评论(0编辑  收藏  举报