C语言关键字const相信对于不少C语言新手是既陌生又熟悉的,好像经常见,但是却不知道为何用,怎么用?学习至此,总结一下const的用法,使用程序来帮助你理解该关键字,希望能帮到像我一样的新手。

  我看了一些参考书,总结了几句话。

  首先,如果别人问你,const的作用是什么,非常简单而且标准不出错的回答是:定义为‘只读’!

  其次,const的难点无非在于,对于变量和指针而言,到底定义了哪一个为只读,作者记忆的方法是:⒈ 看*号在const的左边还是右边,如果是在右边,那么定义就是一个变量只读,如果是在左边,那么就定义了一个指针只读。2.如果单纯的定义了一个只读变量,那么const int a = 3;与int const a = 3;效果相同。

  接下来,举一些例子,来帮助你的记忆理解。

  第一种类型----直接定义一个只读型变量

 //定义一个只读变量
void fun1(void)
{
const int a = ; //定义一个只读型变量
printf("%d\n",a);
// a = 2; //该行代码是错误的,因为尝试对一个只读变量进行赋值。
printf("%d\n",a);
}

  代码非常简单,意图是定义一个只读型变量直接输出一个结果,然后再重新将该变量赋另外一个值,再次输出,注释非常清楚,在此我就不粘贴运行结果了,以后代码同样。

  第二种类型----定义一个指向常型数据的指针(根据我上面讲的规则,你能否猜到这种定义方式--------const int *a)

  首先这种类型的指针,就是数据是常量,不可更改,但是指针可以更改--我列举了三个例子,来佐证这种定义的使用方法。  

  ⒈指针指向一个常量字符串

     /*以指针指向字符串为例*/
const char *a = "szhb";
printf("%s\n",a);
// a[1] = 'c'; //该行代码错误,因为尝试将常量字符串重新赋值
a = "hello!";
printf("%s\n",a);

  ⒉指针指向一个数组(两个小例子)

    /*以指针指向数组为例子1*/
int const a[] = {,,,}; //与const int a[4] = {0,1,2,3}效果一样。
   int i =;
for(i=;i<;i++)
{
printf("%d",a[i]);
}
// a[2] = 9; //该语句错误,尝试将只读变量进行重新赋值。
for(i=;i<;i++)
{
printf("%d",a[i]);
}
     /*以指针指向数组为例子2*/
int a[] = {,,,};
int i = ;
const int *p = a; //间接将数组a[]的值声明为只读变量。
for(i=;i<;i++)
{
printf("%d",p[i]);
}
// p[2] = 9; //该语句错误,尝试将只读变量进行重新赋值。
for(i=;i<;i++)
{
printf("%d",p[i]);
}

  第三种类型----定义一个指向整型数据的常指针(根据我上面讲的规则,你能否猜到这种定义方式--------int *const a)

  这种类型的指针,就是数据是变量,可更改,但是指针不可以更改--我也列举了两个例子,来佐证这种定义的使用方法。

  ⒈常指针指向一个字符串

 /*定义一个常指针指向一个字符串*/
char *const p = "szhb";
printf("%s\n",p);
// p = "hello"; //该条语句错误,因为尝试将一个只读型指针改变指向。
printf("%s\n",p);

  ⒉常指针指向一个整型变量

     int a = ,b = ;
int *const p = &a;
printf("%d\n",*p);
// p = &b; //该条语句错误,因为尝试将一个只读型指针改变指向。
printf("%d\n",*p);

  第四种类型----定义一个指向常型数据的常指针(根据我上面讲的规则,你能否猜到这种定义方式--------const int *const a)

  同上,这种类型的指针和变量,都可更改,举了以下两个例子,来佐证这种定义的使用方法,

  ⒈定义一个指向常型字符串的常指针,二者都不可改变。

    /*定义一个常指针指向一个字符串*/
const char *const p = "szhb";
printf("%s\n",p);
// p = "hello"; //该条语句错误,因为尝试将一个只读型指针改变指向。
printf("%s\n",p);
// p[2] = 'c'; //该条语句错误, 因为尝试改变一个只读型数据。
printf("%s\n",p);

  ⒉定义一个指向常型数组的常指针,二者都不可改变。

     /*定义一个常指针指向一个数组*/
int i = ;
int b[] = {,,};
const int const p[] = {,,};
for(i=;i<;i++)
printf("%d ",p[i]);
printf("\n");
// p = b; //该条语句错误,因为尝试将一个只读型指针改变指向。
for(i=;i<;i++)
printf("%d ",p[i]);
printf("\n");
// p[1] = 5; //该条语句错误, 因为尝试改变一个只读型数据。
for(i=;i<;i++)
printf("%d ",p[i]);
printf("\n");

  以上就是我所总结的关于const的认识和使用,希望能帮到各位初学const的朋友们,以下,是在别人博客上看到的的一些关于const的总结,直接复制过来,勉励你我,共同进步。

*******************************以下内容来源于@firefly_2002博文***********************************

总结:

  1.如果const用于定义一个非指针的普通变量,就是定义了一个常变量,这个变量以后的值在生命期内是不能改变的

  2.如果用于修饰函数返回值,效果和修饰变量一样。

其他:

  1. 必须初始化
      const int i=5; //合法
      const int j; //非法,导致编译错误

  2.在另一连接文件中引用const常量
      extern const int i; //合法
      extern const int j=10; //非法,常量不可以被再次赋值

  3. 是不是const的常量值一定不可以被修改呢?

    观察以下代码:

 const int i=;
int *p=(int*)&i;
*p=;
printf("%d",i);

   通过强制类型转换,将地址赋给变量,再作修改即可以改变常量值,此时输出的结果i = 100;

【C_Language】---C语言const用法总结的更多相关文章

  1. 【转】话说C语言const用法

    原文:话说C语言const用法 const在C语言中算是一个比较新的描述符,我们称之为常量修饰符,意即其所修饰的对象为常量(immutable). 我们来分情况看语法上它该如何被使用. 1.函数体内修 ...

  2. 【三支火把】---C语言const用法总结

    C语言关键字const相信对于不少C语言新手是既陌生又熟悉的,好像经常见,但是却不知道为何用,怎么用?学习至此,总结一下const的用法,使用程序来帮助你理解该关键字,希望能帮到像我一样的新手. 我看 ...

  3. 话说C语言const用法

    const在C语言中算是一个比较新的描述符,我们称之为常量修饰符,意即其所修饰 的对象为常量(immutable). 我们来分情况看语法上它该如何被使用. 1.函数体内修饰局部变量. 例: void ...

  4. (转)话说C语言const用法

    const在C语言中算是一个比较新的描述符,我们称之为常量修饰符,意即其所修饰 的对象为常量(immutable). 我们来分情况看语法上它该如何被使用. 1.函数体内修饰局部变量. 例: void ...

  5. 《OOC》笔记(1)——C语言const、static和extern的用法

    <OOC>笔记(1)——C语言const.static和extern的用法 C语言中const关键字用法不少,我只喜欢两种用法.一是用于修饰函数形参,二是用于修饰全局变量和局部变量. 用c ...

  6. c++ const用法小结

    const用法 1,定义全局变量的内存分配问题 #define  Pi_1  3.14       //使用#define宏 const double Pi_2 = 3.14    //使用const ...

  7. const用法详解(转)

    http://www.cnblogs.com/StudyRush/archive/2010/10/06/1844690.html 面向对象是C++的重要特性. 但是c++在c的基础上新增加的几点优化也 ...

  8. const用法

    一.const作用 二.const用法 1.修饰一般常量   修饰符const可以用在类型说明符前,也可以用在类型说明符后. 例如: ; ; 2.修饰常数组  修饰符const可以用在类型说明符前,也 ...

  9. 标准SQL语言的用法

    原文链接:http://www.ifyao.com/2015/05/18/%E6%A0%87%E5%87%86%E7%9A%84sql%E8%AF%AD%E8%A8%80%E4%BD%BF%E7%94 ...

随机推荐

  1. 判断当前所使用python的版本和来源

    import sys print(sys.prefix) print(sys.executable) 怎样判断当前py文件在什么版本的python环境下运行 import sys print(sys. ...

  2. HDU 6621"K-th Closest Distance"(二分+主席树)

    传送门 •题意 有 $m$ 次询问,每次询问求 $n$ 个数中, $[L,R]$ 区间距 $p$ 第 $k$ 近的数与 $p$ 差值的绝对值: •题解 二分答案,假设当前二分的答案为 $x$,那么如何 ...

  3. PHP PDO扩展整理,包括环境配置\基本增删改查\事务\预处理

    相关文章:PHP的mysql扩展整理,操作数据库的实现过程分析    PHPmysqli扩展整理,包括面向过程和面向对象的比较\事务控制\批量执行\预处理 介绍 PDO是一种PHP程序连接数据库的接口 ...

  4. 2019-4-6-VisualStudio-2019-如何离线下载

    title author date CreateTime categories VisualStudio 2019 如何离线下载 lindexi 2019-04-06 09:26:11 +0800 2 ...

  5. ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(8)之文章管理

    到这一步,我们整个项目的核心搭建已经算是完成了,接下来就是我们业务功能的实际应用,也就是表现层的设计和实现,如果你是一个项目负责人,到这一步,接下来的工作就可以交给下面的兄弟去完成了,在这里我们用文章 ...

  6. 深度解读 - TDD(测试驱动开发)

    转自:http://www.jianshu.com/p/62f16cd4fef3 本文结构: 什么是 TDD 为什么要 TDD 怎么 TDD FAQ 学习路径 延伸阅读 什么是 TDD TDD 有广义 ...

  7. vue-learning:33 - component - 内置组件 - 过渡组件transition

    vue内置过渡组件transition 目录 什么是过渡 基本过渡或动画实现的语法 css过渡动画:transition / animation js过渡:特定事件钩子函数 各种情形下的过渡实现,使用 ...

  8. CodeForces 906D (欧拉降幂)

    Power Tower •题意 求$w_{l}^{w_{l+1}^{w_{l+2}^{w_{l+3}^{w_{l+4}^{w_{l+5}^{...^{w_{r}}}}}}}}$ 对m取模的值 •思路 ...

  9. Nodejs之使用express框架搭建WEB应用

      首先创建一个index.js,在里面引入相关的中间件,如果没有这些中间件,则需要在nodejs里进入index.js所在的文件夹安装这些模块,安装命令:npm install express ex ...

  10. Arcgis api for javascript学习笔记(3.2版本) - 匀速行驶轨迹动画效果

    一.前言 有这样一个需求:已知某条线上的n个点的经纬度数组 ,实现物体运行轨迹. 如果这些点中两个距离很近,那么我们可以用一个定时器在地图上每次重新画一个点,这样肉眼看到这个点上的运动效果,如下图代码 ...