今天看《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的正确用法的更多相关文章

  1. C语言中const关键字的用法

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

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

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

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

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

  4. C语言中const和数组

    C语言中const的用法 const:在定义变量时,如果使用关键字const,那就表示限制这个变量值不允许被改变. (1)     修饰变量 const离谁越近,谁的值就不能改变. int const ...

  5. C-C++到底支不支持VLA以及两种语言中const的区别

    C-C++到底支不支持VLA以及两种语言中const的区别 到底支不支持VLA VLA就是variable-length array,也就是变长数组. 最近写程序的时候无意间发现,gcc中竟然支持下面 ...

  6. C语言中static关键字的用法

    C记得还是大一时学的,现在觉得好久没用了,又捧起来看看.今天刚看到有关static关键字,仔细地看了一遍<C和指针>这本书中的解释,现在觉得清楚多了. 首先,我们将static关键字,修饰 ...

  7. C语言中的extern关键字用法

    在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”. 1. extern修饰变量的声明.举例来说,如果文件a.c需要引用b.c中变量int v ...

  8. [原创]c语言中const与指针的用法

    最近一直在准备笔试,补补大一大二欠下的课.复习c语言时碰见这么个题:   1 2 3 4 5 int a=248, b=4; int const c=21; const int *d=&a;  ...

  9. C语言中const的用法总结

          const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程 ...

随机推荐

  1. Mac OS X 懒人版安装教程(之前的图全部挂了,所以重发了)

    请版主把我之前发的那个帖子删了!因为所有的图全部挂了,所以麻烦版主了…… 安装中出现五国的话就请进入这里看看是那里的错误http://bbs.pcbeta.com/viewthread-863656- ...

  2. String与StringBuilder之间区别(转)

    当我们在初学使用C#时,常常会不知道该用StringBuilder合适还是用String高效,下面是我在学习当中对StringBuilder和String的区别总结,分享给大家. String类有不可 ...

  3. python中多进程(multiprocessing)

    一.multiprocessing中使用子进程概念 from multiprocessing import Process 可以通过Process来构造一个子进程 p = Process(target ...

  4. 在windows下新建maven项目

    1.拷贝settings到.m2文件下 2.修改文件 3.新建Project项目 4.转换为maven项目 config下转换 5.拷贝pom文件 6.新建目录 src/main/java src/m ...

  5. Git 学习01

    一.下载并安装git bash 双击打开出现命令窗口 创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录: cd F: mkdir learngit pwd F/learngit 显示当 ...

  6. Metasploitable 2系列教程:信息收集

    Metasploitable 2 系统是一个基于ubuntu 的系统.其设计的最初目的为安全工具测试和常见漏洞攻击演示.而在这篇关于 Metasploit 的教程中,我们将列举有关 Metasploi ...

  7. wp插件

  8. Java学习-043-获取文件在目录中的路径

    我们在日常的电脑使用中,经常需要在当前目录或当期目录及其子目录中查找文件,并获取相应的文件路径名.在我们的自动化测试中,也经常需要确认文件在目录中是否成功生成或已存在,因而我写了一个小方法来实现. 获 ...

  9. 白话学习MVC(十)View的呈现二

    本节将接着<白话学习MVC(九)View的呈现一>来继续对ViewResult的详细执行过程进行分析! 9.ViewResult ViewResult将视图页的内容响应给客户端! 由于Vi ...

  10. MVC项目实践,在三层架构下实现SportsStore,从类图看三层架构

    在"MVC项目实践,在三层架构下实现SportsStore-02,DbSession层.BLL层"一文的评论中,博友浪花一朵朵建议用类图来理解本项目的三层架构.于是就有了本篇: I ...