C语言中const的正确用法
今天看《Linux内核编程》(Claudia Salzberg Podriguez等著)时,文中(p39)有一个错误,就是关于const的用法。
原文中举例说明:const int *x中x是一个指向const整数的指针,因此可以修改该指针,不可以修改这个整数。而在int const *x中,x却是一个指向整数的const指针,因而这个整数可以改变,但是指针不可以改变。本来我也对这个不是很懂,于是就写了个测试例子测了一下:
测试一,const int *x,代码如下:
int b = ,a=;
const int *c = &a;
c = &b;
printf("c is %d\n",*c);
测试结果:c is 1,即,指针可以修改
修改下:
int b = ;
const int *c = &b;
*c = ;
printf("c is %d\n",*c);
测试结果,编译错误(GCC):
line 3 , error: assignment of read-only location '*c'
由此证明该书中对于 const int *x的描述是正确的,然而问题在于对 int const *x 的描述:”因而这个整数可以改变,但是指针不可以改变“ 却是错误的。
测试二:
int g = ;
int const *d;
d = &g;
int f = ;
d = &f;
printf("d is %d\n",*d);
测试结果 d is 23,这个指针是可以改变的!
改一下:
int g = ;
int const *d;
d = &g;
*d = ;
printf("d is %d\n",*d);
测试结果,编译错误(GCC)
line 4 , error: assignment of read-only location '*d'
所以,const int *x 和 int const *x是一样的,他们都是一个指向const整数的指针,可以修改该指针,但是不能修改这个整数。
从这篇文章也得出相同结论。
那么正确的:”指向一个整数的const指针,即整数可变,指针不可变“ 用const应该怎么定义?
测试三:
int g = ;
int * const d = &g;
int e = ;
d = &e;
printf("d is %d\n",*d);
结果:编译出错:
line 4 error: assignment of read-only variable 'd'| 即:不能改变指针d
改一下:
int g = ;
int * const d = &g;
*d = ;
printf("d is %d\n",*d);
测试结果:
d is 24,即可以修改整数。
所以int * const x 是 指向一个整数的const指针,即整数可变,指针不可变。
结论:
所以我们可以简单记下这个规则,const 直接修饰的才是只读的,不可变的,
对于const int *x 和 int const *x,const直接修饰的应该是”整型“,所以,这个整数不可变,但是这个指针可变。
对于int * const x,const直接修饰的应该是”指针x“,所以,这个指针不可变,但是这个整数可变。
/* 全文原创,转载请注明出处,如果有不同看法或者问题欢迎随时评论给我。^_^ */
C语言中const的正确用法的更多相关文章
- C语言中const关键字的用法
关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变,我想一定有人有这样的疑问,C语言中不是有#define吗,干嘛还要用const呢,我想事物的存在一定有它自己的道理 ...
- C/C++语言中const的用法
1. const 在C和C++中的区别 C++中的const正常情况下是看成编译期的常量,编译器并不为const分配空间,只是在编译的时候将期值保存在名字表中,并在适当的时候折合在代码中. 所 ...
- C语言中system()函数的用法总结(转)
system()函数功能强大,很多人用却对它的原理知之甚少先看linux版system函数的源码: #include <sys/types.h> #include <sys/wait ...
- C语言中const和数组
C语言中const的用法 const:在定义变量时,如果使用关键字const,那就表示限制这个变量值不允许被改变. (1) 修饰变量 const离谁越近,谁的值就不能改变. int const ...
- C-C++到底支不支持VLA以及两种语言中const的区别
C-C++到底支不支持VLA以及两种语言中const的区别 到底支不支持VLA VLA就是variable-length array,也就是变长数组. 最近写程序的时候无意间发现,gcc中竟然支持下面 ...
- C语言中static关键字的用法
C记得还是大一时学的,现在觉得好久没用了,又捧起来看看.今天刚看到有关static关键字,仔细地看了一遍<C和指针>这本书中的解释,现在觉得清楚多了. 首先,我们将static关键字,修饰 ...
- C语言中的extern关键字用法
在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”. 1. extern修饰变量的声明.举例来说,如果文件a.c需要引用b.c中变量int v ...
- [原创]c语言中const与指针的用法
最近一直在准备笔试,补补大一大二欠下的课.复习c语言时碰见这么个题: 1 2 3 4 5 int a=248, b=4; int const c=21; const int *d=&a; ...
- C语言中const的用法总结
const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程 ...
随机推荐
- apk反编译、smali修改、回编译笔记
最近下了一个apk程序,但是一启动会弹出一个流氓广告.这个广告不是原厂商加的,而是有人在原有apk程序的基础上,加了一个壳,让apk先启动他加的广告,再启动原来的程序,很恶心.于是想去掉它. 试了几个 ...
- 为 mysql 数据表添加主键
DROP TABLE IF EXISTS `sdo_actData`.`actCDKey`; CREATE TABLE `sdo_actData`.`actCDKey` ( `RoleID` ) ' ...
- C#中判断字符是否大写
在C#中,通常判断一个字符是否为大写字母,有些人可能会第一时间想到用正则表达式,那除了正则表达式,是否还有其他方式呢? 答案是肯定的,先一睹为快,具体代码如下: using System; using ...
- syslog-ng日志系统
一.基础syslog-ng作为syslog的替代工具,可以完全替代syslog的服务,并且通过定义规则,实现更好的过滤功能.系统自带版本(我的是红旗,不同系统用不同的方式查询): 引用 # rpm - ...
- Redis的Python客户端redis-py
1. 安装 1. redis-py a. 使用easy_install 1 sudo easy_install redis b. 源码安装 1 2 3 git clone https://githu ...
- 明白何谓Margin Collapse
不同于其他很多属性,盒模型中垂直方向上的Margin会在相遇时发生崩塌,也就是说当某个元素的底部Margin与另一个元素的顶部Margin相邻时,只有二者中的较大值会被保留下来,可以从下面这个简单的例 ...
- centos 下 安装zookpeer
tar xvf zookeeper-3.4.6.tar.gz cd /usr/local/zookpeer/ mkdir /var/zookpeer mkdir /var/zookpeer/data ...
- RDIFramework.NET V2.5(.NET快速信息化系统开发框架) Web版界面样例(可参考)
RDIFramework.NET V2.5(.NET快速信息化系统开发框架) Web版介绍 现已升级到V2.8,点击查看 B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起 ...
- ubuntu安装eclipse配置jdk环境
$ sudo mkdir /usr/local/java //在此目录下新建一个文件夹java $ sudo mv 下载/jdk-8u111-linux-i586.tar.gz /usr/local/ ...
- bootstrap入门-1.可视化布局
下载地址:http://v3.bootcss.com/getting-started/#download HTML模板: <!DOCTYPE html> <html> &l ...