const用法详解

一 const的基本概念

const名叫常量限定符,用来限定特定变量,以通知编译器该变量是不可修改的。习惯性的使用const,可以避免在函数中对某些不应修改的变量造成可能的改动。

二 const修饰基本数据类型

2.1 const修饰一般常量及数组

int const a = 100;
const int a = 100; //与上面等价
int const arr [3] = {1,2,3};
const int arr [3] = {1,2,3};//与上面等价

2.2 const修饰指针(*)

char *p = "hello";     // 非const指针,非const数据

const char *p = "hello";  // const数据

char * const p = "hello";   // const指针

const char * const p = "hello";  // const指针,const数据
char str[] = "I LOVE CHIAN!";
const char* p;//常量指针
//代表p指向的东西不能通过p来修改(p指向的目标,那个目标中的内容不能通过p来修改);
p = str;
*p = 'Y';//此时这里会编译错误
p++;//地址也可以被改变;
//虽然不能修改*p,但可以通过其他修改;如:
str[0] = 'Y';//这样通过修改str中的内容可以修改*p中指向的内容,即间接修改
char str[] = "I Love China!";
char* const p = str;//指针常量
//此时char *const p定义的时候必须初始化。
//p一旦指向了一个东西之后,就不可以在再指向其他东西了。即p++不可以用了
//事例如下:
p++;//这里会报错p不能再改变;
*p = 'Y';//这里不会报错,指向的内容可以被修改;

总结:const char*p(char const*p)与char* const区别:

      (1)const char*p(char const*p)指向的内容不能再改变
               char* const p指向的内容可以再被改变

      (2)const char*p(char const*p)指向的地址可以被改变,即可以p++
               char* const p指向的地址不能再改变,即不可以p++
      (3)const char* const p(char const* const p):指向的内容和地址都不能再被改变

2.2.1 常量指针(const *)

当为常量指针时,不可以修改常量,但是可以修改指针指向别的

指针变量保存的地址可以改变,指向的对象的内存值不能修改

int a = 5;
const int *p =&a;
*p = 20;   //error  不可以通过修改所指向的变量的值

int b =20;
p = &b; //right  指针可以指向别的变量
2.2.2 指针常量(* const)

当为指针常量时,不可以修改指针指向,但是可以修改常量

指针变量保存的地址不可修改,但内存值可以修改

int a = 5;
int *const p = &a;
*p = 20;     //right 可以修改所指向变量的值

int b = 10;
p = &b;      //error 不可以指向别的变量

左定值,右定向,const修饰不变量

如果const既修饰指针又修饰值如下

//常量指针,指针修饰得是p指向的值
const char* const p

那么既不能修改指针地址,也不能修改指针指向的值。

三 const修饰函数

const 在函数中根据修饰的位置分为三种:函数参数、函数返回值、成员函数。

const  int fun (const int a) const;

3.1 const修饰函数参数

修饰函数形参;函数体内不能修改形参a的值。

如果函数作为输出用,不论是什么数据类型,也不论采用指针传递还是引用传递,都不能加const 修饰,否则参数会失去输出功能。

所以:const 只能修饰输入作用的参数

3.1.1 如果参数为指针
如果输入参数为指针,加上const之后就会起保护指针意外修改的作用。

void StringCopy(char* strDest, const char* strSource);

在这个函数定义中,我们的的参数strsource加上const修饰,就是为了防止strsource被修改。

可以起到保护作用的原因是:
实参中,指针会指向一段内存地址,调用函数之后,函数会产生一个临时指针变量,这个变量的地址与实参的地址不一样,但是这两个指针指向的内存是同一块。形参加上const 修饰之后,保护了这一块内存地址不被修改,如果刻意修改这一块内存,编译器会报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值