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所起的作用,对理解对方的程 ...
随机推荐
- Maven:解决-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variable and mvn script match.
1.添加M2_HOME的环境变量 2.Preference->Java->Installed JREs->Edit 选择一个jdk, 添加 -Dmaven.multiModuleP ...
- (转)python爬取拉勾网信息
学习Python也有一段时间了,各种理论知识大体上也算略知一二了,今天就进入实战演练:通过Python来编写一个拉勾网薪资调查的小爬虫. 第一步:分析网站的请求过程 我们在查看拉勾网上的招聘信息的时候 ...
- AFN 2.6 code报错总结
1. 错误打印 code=-1016 filed: text/html 错误原因:AFN默认不能解析请求回来的text/html数据 解决办法: AFN3.0的请看这里 AFHTTPSessionM ...
- JS脚本文件的位置对页面加载性能影响以及无阻塞脚本(javascript)模式
JS的阻塞特性:当<script>出现的时候,页面必须等待脚本文件的加载.解析.执行完毕后才能继续进行页面的渲染.不管脚本文件是以内联形式还是外部引入的形式出现在<script> ...
- Java程序员从笨鸟到菜鸟之(十三)java网络通信编程
本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 首先声明一下,刚开始学习java网络通信编程就对他有一种畏惧感,因为自己对网络一窍不通,所 ...
- matlab实现分水岭算法处理图像分割
此程序为优化后的分水岭算法,避免了图像过分割 I= imread('D:\Images\pic_loc\1870405130305041503.jpg'); imshow(I); h=fspecial ...
- winform 窗体移动API、窗体阴影API
//窗体移动API [DllImport("user32.dll")] public static extern bool ReleaseCapture(); [DllImport ...
- Pyhton 学习总结 20 :执行系统命令
在Python中执行系统命令有os.system().os.popen().commands.getstatusoutput().subprocess.Popen等 1.os.system() ...
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数012,polygon,多边形
<zw版·Halcon-delphi系列原创教程> Halcon分类函数012,polygon,多边形 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换 ...
- MyEclipse启动慢的办法
禁用myeclipse updating indexes MyEclipse 总是不停的在 Update index,研究发现Update index...是Maven在下载更新,但很是影响myecl ...