const 修饰指针
Posted LC编程开发者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了const 修饰指针相关的知识,希望对你有一定的参考价值。
const 修饰指针
假设有如下定义一个指针:
int a = 12689;//定义int类型的变量a;
int* p = &a; //定义int*类型的指针变量p,并且设置变量a 的地址,所以,指针p指向变量a;
那么,const 在 int* p 这个形式中,可以存放在两个不同的地方,存放在不同的地方,就修饰不同的内容为“常量”。
(1) const 紧跟着指针变量后面,例如:
char* const pstr = "www.mylinux.vip";//定义pstr指针变量,指向一串字符串;
就是 const 后面紧接这 pstr,所以, const 就修饰 pstr 这个指针,那么,pstr 就是一
个常量,所以,pstr存放的地址值是一个常量,不可以改变。就是不可以修改pstr指针变量存放的数值(pstr指针变量存放的地址值)。例如:
编译提示错误:
所以,pstr是只读类型,不可以修改pstr指针变量的值。不可以修改pstr指针变量存放的地址值。
(2) const 紧跟在指针类型的后面,例如:
const char* pstr = " www.mylinux.vip ";//定义pstr指针变量,指向一串字符串
就是 const 后面紧接着 char,所以,const 修饰的是 char,那么,char 表示 pstr 指向的内容,所以,定义了 pstr 指向的内容是常量,所以,不可以修改 pstr 指向的内容。如下是测试的例子:
程序编译结果如下:
可以看到pstr指向的数据是只读类型,不可以修改pstr指向的数据。
但是,pstr指针变量存放的数据不是只读类型,可以修改pstr存放的地址值。测试例子如下:
程序编译运行结果如下:
可以看到,pstr指向了新的字符串“www”,所以,可以修改指针变量pstr存放的数据。但是,不可以修改pstr指向的数据。
如下是一个分析的例子:
int a = 30; //定义int类型变量a,并设置30这个数值;
const int* p = &a;//定义指针类型变量p,指向变量a;而且,指针变量p是常类型;
所以,const关键字后面跟着int类型,所以,修饰指针p 指向的内容int 是一个常量,不可以修改,所以,不可以修改指针p指向的数据。所以,如下的执行是错误的:
*p = 6; //错误,因为,p 指向的内容是一个常量,不可以修改
测试代码如下:
编译结果如下:
可以看到,在第10行代码,执行:*p = 6; 的语句是错误的,因为,*p是一个read only属性,指针变量p指向的数据是一个“只读”类型,所以,不可以修改指针变量p指向的数据。
在上面的例子中,指针变量p指向变量a。所以,不可以通过指针p来修改变量a的数据。
所以,*p是对指针变量p降级,转换成它所指向的变量a。那么,给*p赋值,就是给指针变量p指向的变量a赋值。所以,是不允许的!
但是,指针p 存放的地址值是可以修改的,如下:
int b = 10;
p = &b; //正确,可以修改p 存放的地址值;
此时,修改指针p存放的变量地址。如下是程序测试例子:
程序运行结果如下:
可以看到,上面的例子,定义指针变量p指向的存储空间是const类型,所以,不可以修改指针变量p指向的空间。
但是,指针变量p存储的数据(地址值),不是const类型,所以,可以修改指针变量p存储的数据。那么,上面的代码,修改指针变量p的值,指向变量b的地址。最终,输出指针变量p指向内存的数据,就是变量b中的数据。
如果我们想定义指针变量p,不可以修改它指向的内存,也不可以修改指针变量p存储的数据?
答案是:可以,我们需要再使用const关键字来修饰指针p,定义如下:
const int* const p = &a;
此时,在指针变量p之前,再添加const关键字,所以,进行了双重保护。表示定义指针变量p是const类型,那么,它存储的数据是const类型,不可以修改。测试例子如下:
程序编译结果如下:
可以看到,提示变量p是read only类型,是只读,不可以修改指针变量p存储的数据。
所以,我们可以通过const类型定义“常量”,保护变量中的数据。那么,我们可以归纳总结如下:
- const修饰指针变量
例如:char* const p; 此时,const关键字后面跟着指针变量p,所以,修饰指针变量p存储数据。那么,指针变量p存储的数据是常类型,不可以修改指针变量p存储的数据。所以,不可以修改指针变量p存放的地址值。
- const修饰指针变量指向的数据
例如:const char* p; 此时,const关键字后面跟着char类型,所以,修饰指针变量p指向的数据。指针变量p指向一个char类型的数据,所以,定义指针变量p指向的char类型的数据是常量。不可以被修改。
- const修饰指针变量和指针变量指向的数据
例如:const char* const p; 此时,使用const关键字进行双重保护。那么,指针变量p存储的地址值是常量,而且,指针变量p指向的char类型的数据也是常量,都不可以被修改。
韦凯峰 Linux C/C++ 程序设计教程,Linux 系统编程,Openwrt 系统开发,微信:13926572996,QQ:1523520001,博客:www.mylinux.vip
以上是关于const 修饰指针的主要内容,如果未能解决你的问题,请参考以下文章
C 语言const 关键字用法 ( 常量指针 - const 在 * 左边 - 修饰数据类型 - 内存不变 | 指针常量 - const 在 * 右边 - 修饰变量 - 指针不变 )