const关键字常和指针一起使用.

1,const给读代码的人传达非常有用的信息。比如一个函数的参数是const char *,你在调用这个函数时就可以放心地传给它char *或const char *指针,而不必担心指针所指的内存单元被改写。

2,尽可能多地使用const限定符,把不该变的都声明成只读,这样可以依靠编译器检查程序中的Bug,防止意外改写数据。

3,const对编译器优化是一个有用的提示,编译器也许会把const变量优化成常量。

环境: Linux 2.6.32-279.el6.i686

GCC版本: gcc 4.4.6 20120305 (Red Hat 4.4.6-4)

case 1:

 const int *p; // int const *p;
*p = ; // error!
p++; // ok

两种写法是一样的,const 修饰*p ,p所指向的内存单元(*p)只读,即(*p)++违法;但是指针p可读写,即可以p++.

case 2:

 int * const p;
*p = ; // ok
p++; // error

const修饰指针p, p的内容只读,即p++违法;p所指向的内存单元(*p)可读写,即(*p)++合法.

case 3:

 const int * const p;
*p = ; // error
p++; // error

第一个const 修饰 *p,*p只读,(*p)++违法;第二个const 修饰指针p,即指针p的内容只读,p++违法.

case 4:

const 指针与非const指针间的传递

1,指向非const变量的指针(非const变量的地址)可以传给指向const变量的指针,编译器可以做隐式类型转换;

函数形参中使用const关键字的,调用函数时可以放心的

 char c = 'a';
const char *pC = &c; // ok

2,指向const变量的指针传递给指向非const变量的指针非法,编译器报错:"初始化丢弃了指针目标类型的限定."

 const char s = 'b';
char * pS = &s; // error!

case 5:

如果要定义一个指针指向字符串字面值,最好使用const,虽然不用也不会报错,但是这样就存在了隐患.

 const char * pB = "abc";
*pB = 'q'; // error
// 编译时就会报错,不允许向只读位置赋值
 char *pA = "abc"; // 这里编译无错无警告
*pA = 'd'; // 这里编译也无错无警告 // 但是运行时报段错误

case 6: 

函数形参中使用关键字const ,调用函数时可以放心地把char *和const char *传递给它,而不必担心指针所指的内存单元被改写.

 void foo(const char *pS)
{
...
*pS = 'a' // error 无法编译通过
...
}
...
const char *pC = "abc"; // 指针定义
char a[] = "abc"; // 数组定义
...
foo(pC); // ok
foo(a); // ok

注:函数的指针形参用数组方式亦可

 void foo(const char pS[]);

case 7:

const并不能完全防止值的修改,只要在函数中把const指针再赋给普通指针.

/* file: const.c */

#include <stdio.h>
#include <stdlib.h> void fun_SomeManage(const int *pA, size_t count)
{
int *ucpA = pA;
ucpA[] = ; return;
} int main(int argc,char * argv[])
{
int pA[] = {,,,}; printf("before fun called: \n"); size_t i = ;
while (i--)
{
printf("pA[%d] = %d \n", (-i), pA[-i]);
} fun_SomeManage(pA,); printf("after fun called: \n");
i = ;
while (i--)
{
printf("pA[%d] = %d \n", (-i), pA[-i]);
} return ;
}

编译:

# make const

有警告:

cc     const.c   -o const
const.c: 在函数‘fun_SomeManage’中:
const.c:: 警告:初始化丢弃了指针目标类型的限定

运行结果:

# ./const
before fun called:
pA[] =
pA[] =
pA[] =
pA[] =
after fun called:
pA[] =
pA[] =
pA[] =
pA[] =

说明const指针传给非const指针后,虽然编译器会有警告,但是并不干涉通过新的指针修改值了.

The End.

关键字const的更多相关文章

  1. C语言关键字const作用及其应用

    只要学过C语言的,都有知道const这个关键字,知道是用来定义常量的,如果一个变量被const修饰,那么它的值就不能再被改变,那么还有什么其他作用呢? 一.const常用作用 1.修饰局部变量 con ...

  2. ES6中不得不说的关键字const

    上一节讲了let关键字,它是用来声明一个变量,只在块级作用域起作用.这一节我们来学习ES6新增的另一个关键字const. const 的作用 const是constant(常量)的缩写,const和 ...

  3. final关键字+const关键字

    final关键字 1.如果我们希望某个类不被其它的类来继承(可能因为安全考虑),可以使用final. 例题 <? final class A{} class B extends A{};//会报 ...

  4. 关键字 const

    如果关键字出现在星号左边,表示被指物是常量: 如果出现在星号右边,表示指针本身是常量: 如果出现在星号两边,表示被指物和指针都是常量. void f1(const Widget* pw); //f1和 ...

  5. js-变量定义关键字const,var,let

    1.var定义的变量可以修改,如果不初始化会输出undefined,不会报错. js中最常用的关键字:基本大多数据学js时都只看到使用过var.从没相关还有其他定义 var a = 1; // var ...

  6. 如何使用C#关键字const,readonly,static

    如果有一个值不太会变化,我们经常使用const和readonly,这2者有何不同呢?有时候,我们也会在readonly之前加上关键字static,这又意味着什么呢? const ● const默认是静 ...

  7. C#关键字 const与readonly

    ====const==== const关键字来声明某个常量字段或常量局部变量.常量字段和常量局部变量不是变量而且不能修改.常量可以为数字.布尔值.字符串或null引用. 常数声明的类型指定声明引入的成 ...

  8. ES6中的关键字 - const

    const 关键字 1.声明后的值不可以修改: const name = "小康哥"; name = "小康"; // 报错,const为constant的缩写 ...

  9. c语言 - 关键字const的作用

    const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的. 1.const char * p1;              //表示p1指向了的字符串不可更改 2.char const ...

随机推荐

  1. ORA-00205

    场景 数据库启动时报错.关闭前还是正常运行的,再次启动时,就报了以下错误. Copyright (c) , , Oracle. All rights reserved. Connected to an ...

  2. Structs1 -配置例子(转)

    转自:(http://blog.csdn.net/xys_777/article/details/7542095) Action, ActionForm, ActionForward ,这三个对象构成 ...

  3. java 导入包(误区)

    java的导入包语句的作用仅仅是简化书写,很多时候我们都误以为是将一个类导入到内存中. 如果是这样,那么运行的效率会很慢.

  4. Machine Learning for hackers读书笔记(三)分类:垃圾邮件过滤

    #定义函数,打开每一个文件,找到空行,将空行后的文本返回为一个字符串向量,该向量只有一个元素,就是空行之后的所有文本拼接之后的字符串 #很多邮件都包含了非ASCII字符,因此设为latin1就可以读取 ...

  5. jmeter笔记4

     软件测试中使用JMeter测试Web应用 JMeter作用领域 JMeter可以用于测试静态或者动态资源的性能(文件.Servlets.Perl脚本.java对象.数据库和查询.ftp服务器或者其他 ...

  6. 关于JVM的类型和模式

    原文出处: 摆渡者 引言 曾几何时,我也敲打过无数次这样的命令: 然而之前的我都只关心过版本号,也就是第一行的内容.今天,我们就来看看第3行输出的内容:JVM的类型和工作模式. 其实说Server和C ...

  7. (27)odoo 中改变菜单动作的默认视图

    一个动作下面有多个视图来支持,像表单视图.列表视图.看板视图.图表视图等 这时我们想改变系统默认指定的视图,方法其实有两种,一种是通过面板改,一种是开发一个小模块 举一例:项目默认打开是用了看板视图, ...

  8. 转 SQL Union和SQL Union All两者用法区别效率以及与order by 和 group by配合问题

    SQL Union和SQL Union All两者用法区别效率以及与order by 和 group by配合问题 SQL Union和SQL Union All用法 SQL UNION 操作符 UN ...

  9. 聚类算法:ISODATA算法

    1. 与K-均值算法的比较 –K-均值算法通常适合于分类数目已知的聚类,而ISODATA算法则更加灵活: –从算法角度看, ISODATA算法与K-均值算法相似,聚类中心都是通过样本均值的迭代运算来决 ...

  10. HTML5 视频规范简介

    HTML5 视频规范简介  创建于 2013-02-03, 周日 00:56  作者 白建鹏 HTML 一词是“超文本标记语言”(Hyper-Text Markup Language)的缩写,是用于描 ...