c语言const怎么用,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关键字的用法

关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变,我想一定有人有这样的疑问,C语言中不是有#define吗,干嘛还要用const呢,我想事物的存在一定有它自己的道理 ...

C/C++语言中const的用法

1. const 在C和C++中的区别     C++中的const正常情况下是看成编译期的常量,编译器并不为const分配空间,只是在编译的时候将期值保存在名字表中,并在适当的时候折合在代码中. 所 ...

C语言中system()函数的用法总结(转)

system()函数功能强大,很多人用却对它的原理知之甚少先看linux版system函数的源码: #include #include

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关键字,仔细地看了一遍这本书中的解释,现在觉得清楚多了. 首先,我们将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所起的作用,对理解对方的程 ...

随机推荐

iOS之中途修改类名

中途修改类名 在开发过程中,可能感觉之前设置的类名不够代表性,或者发现名字拼写错误等等诸如此类的原因,需要修改类名,不懂技巧的话简直不敢改,现在这里就记录下该类名的方法. 具体步骤如下: .h文件里选 ...

长文丨papi、咪蒙、罗胖之后,内容创业的机会在哪儿

一.内容的一年 app死了,内容永生! 2016年,创业圈画风突变,昨天还在激辩java和PHP谁更好的技术宅们.还在梦想着成为第二个乔布斯改变世界的产品狗们.还在忽悠着用O2O横扫传统行业的小老板们 ...

MakeObjectInstance的简单理解

昨天把MakeObjectInstance的代码详细研究了一下,当然还有众多前辈高手们的帮助,终于大致搞明白了是怎么回事.但是给我顿悟的,不是高手们的帖子,而是来自我自己的一个疑惑,TObjectIn ...

hadoop_并行写操作思路_2

如果想实现将 Client端的 File并行写入到 各个Datanode中, 首先, 应该修改的是,DistributedFileSystem中的create方法, 在create 内部调用FSNam ...

【HDOJ】1520 Anniversary party

第二道树形DP,先是MLE.后来仅需改小邻接矩阵的第二个维度到30就过了. #include #include #include < ...

ExtJS 创建动态加载树

Ext 中导航树的创建有两种方式:1.首先将所有的数据读出来,然后绑定到前台页面.2.每点击一个节点展开后加载子节点.在数据量比较小的时候使用第一种方式加载的会快一些,然而当数据量比较大的时候,我还是 ...

sku 加减号的增删

---恢复内容开始--- //php页面public function test(){ $id="1"; $data=Db::table('week3_goods') ->j ...

u-boot之内核是怎么启动的

在u-boot之start_armboot函数分析已经分析过了整个程序框架,但只是说了下什么时候运行内核,并没有具体说明是怎么执行内核的.内核启动分以下几个步骤说明: 1.启动参数bootcmd=na ...

数链剖分(Aragorn&&num;39&semi;s Story )

题目链接:https://vjudge.net/contest/279350#problem/A 题目大意:n个点,m条边,然后q次询问,因为在树上,两个点能确定一条直线,我们可以对这条直线上的所有值 ...

团队博客作业Week3 --- 项目选择&amp&semi;&amp&semi;需求疑问

项目选择 经过团队内所有成员一致探讨,我们团队选择完善和改进之学霸系统的第二个子模块,即:网站内容结构定义和数据处理.具体的要求如下:(摘自Xueba系统项目需求) 网站内容结构定义和数据处理(Con ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值