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所起的作用,对理解对方的程 ...
随机推荐
- 设置sublime text2/3中默认预览浏览器快捷键的方法
各位前端大神们,大家在用IDE编辑器的时候喜欢用哪些呢?是Dreamweaver.Zend Studio.editplus又或者是sublime text?今天马浩周给大家就要说说设置sublime ...
- css公共样式
/* ==================================================================== @ set browser style ======== ...
- 相识从C语言开始
大家好,我是你们这学期C语言的助教吴科桥(女O(∩_∩)O),非常开心能在你们美好的大学这站与你们相遇,希望可以为你们学习C语言略尽绵薄之力. 开学第一周: 1. 希望每个同学都可以有自己的博客,我会 ...
- 有关segue的简介
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { ViewControllerB *vc = segue ...
- angularJs的ng-class切换class
在angular中为我们提供了3种方案处理class: 1:scope变量绑定 2:字符串数组形式. 3:对象key/value处理. 第一种我们不推荐使用,看看其他两种解决方案: 字符串数组形式 字 ...
- LeetCode Walls and Gates
原题链接在这里:https://leetcode.com/problems/walls-and-gates/ 题目: You are given a m x n 2D grid initialized ...
- MVC_表单和HTML辅助方法
表单的使用 action特性告知Web浏览器信息发往哪里. method特性告知浏览器使用HTTP POST 还是 HTTP GET. GET请求用于读操作, POST请求用于写操作 HTML辅助方法 ...
- docker images之间相互通信 link
同一个host上的两个container 首先启动一个nginx. container起名叫netease_nginx docker run --detach --name netease_nginx ...
- Hosts简单说明
Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联"数据库",当用户在浏览器中输入一个需要登录的网址时,系统 ...
- ThinkPHP讲解(十)——第三方类的引入:以分页为主
第三方类的引入,以分页类为例: 1.在控制器里新建一个分页的操作方法FenYe() 注意:第三方类Page.class.php放在Think或Home文件夹下,并新近一个文件夹,放在里面,并在其类里加 ...