参考博客:https://www.cnblogs.com/bianchengzhuji/p/10335837.html

  const是constant的简写,是不变的意思。但并不是说它修饰常量,而是说它限定一个变量为只读。但是并非真正意义上的只读

  1、看个例子1:

#include <stdio.h>
int main(void)
{
// int num=10;
// num=9;
// printf("%d",num);
// return 0;
int a=;
int b=;
const int *p=&a;
printf("%d",*p);
}

输出:9

p是一个指向int类型的const值,与 int const *p等价

  2、例子2:

#include <stdio.h>
int main(void)
{
const int num=;
num=;
printf("%d",num);
return ;
// int a=9;
// int b=8;
// const int *p=&a;
// printf("%d",*p);
}

报错:

C:\Users\xinhao\Documents\test01.c: In function 'main':
C:\Users\xinhao\Documents\test01.c:5:5: error: assignment of read-only variable 'num'

报错原因是num这个变量是只读的,强行num=9就会报错

  3、例子3:

#include<stdio.h>
void myPrint(const char *str);
void myPrint(const char *str)
{
str[] = 'H';
printf("my print:%s\n",str);
}
int main(void)
{
char str[] = "hello world";
myPrint(str);
return ;
}

报错:

C:\Users\xinhao\Documents\test01.c: In function 'myPrint':
C:\Users\xinhao\Documents\test01.c:5:12: error: assignment of read-only location '*str'
str[0] = 'H';

报错原因是myPrint函数修改传入的字符串内容,因此入参使用了const限定符,表明传入的字符串是只读的,因此,如果myPrint函数内部如果尝试对str进行修改,将会报错

我们自己在编码过程中,如果确定传入的指针参数仅用于访问数据,那么应该将其声明为一个指向const限定类型的指针,避免函数内部对数据进行意外地修改

  4、例子4:

#include <stdio.h>
int main(void)
{
const int a = ;
int *p = &a;
*p = ;
printf("%d\n",a);
return ;
}

此时编译器给了个warring:

C:\Users\xinhao\Documents\test01.c: In function 'main':
C:\Users\xinhao\Documents\test01.c:5:14: warning: initialization discards 'const' qualifier from pointer target type
int *p = &a;

运行输出:2019

  5、在a文件中定义,其他文件中使用外部声明

a文件中:const int ARR={1,2,3,4,5,6,7,8,9} //定义int数组

b文件中:extern const int ARR={1,2,3,4,5,6,7,8,9}  //这里不能对ARR赋值

  6、在a文件中定义,并使用static修饰,b文件包含a文件

a文件中:static const int ARR={1,2,3,4,5,6,7,8,9} //定义int数组

b文件中:#include<a.h>//后面可以使用ARR

C语言:const关键字用法的更多相关文章

  1. C语言学习及应用笔记之三:C语言const关键字及其使用

    在C语言程序中,const关键字也是经常会用到的一个关键字,那么使用const关键字的目的是什么呢?事实上,在程序中使用const关键字的主要目的就是为了向使用者传递设计者的一些意图. 事实上,无论我 ...

  2. C++const关键字用法

    const关键字是C++新引进的关键字,目标是用于定义常量,避免C语言中使用宏定义出现的边际问题,并且const是类型安全的,即const定义的是不可修改值的变量,它是有类型的,但是宏替换只是简单的进 ...

  3. C++ const关键字用法详解

    1const char*, char const*, char*const的区别问题几乎是C++面试中每次都会有的题目. 事实上这个概念谁都有只是三种声明方式非常相似很容易记混. Bjarne在他的T ...

  4. C/C++经典面试题1,const关键字用法总结

    本文主要说明了const关键字的作用,包括了用于对数组,指针与类相关的修饰方法,作为笔记总结使用.若有错误与不足,欢迎指正. const关键字 用于修饰一个常类型,常类型的变量或对象的值无法被改变,即 ...

  5. C语言const关键字的作用

    1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <string.h> 4 #include ...

  6. C++中const关键字用法

    为什么使用const?采用符号常量写出的代码更容易维护:指针常常是边读边移动,而不是边写边移动:许多函数参数是只读不写的.const最常见用途是作为数组的界和switch分情况标号(也可以用枚举符代替 ...

  7. C++中const关键字用法总结

    看完了c++ primer的基础篇,对const还是有点陌生,在这里小小地总结一下吧. 1) const与变量 在变量的定义前加上 const 修饰符即可完成const对象的创建. const int ...

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

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

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

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

随机推荐

  1. spring boot 过滤器 前后端分离跨域sessionId不一致

      import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servlet.http ...

  2. 027.掌握Service-Ingress使用

    一 Ingress简介 1.1 Ingress 通常Service的表现形式为IP:Port,即工作在TCP/IP层. 对于基于HTTP的服务来说,不同的URL地址经常对应到不同的后端服务(RS)或者 ...

  3. 关于form表单:hover没有修改表单子元素样式

    原来在写todolist的时候遇到的一个问题 是关于form表单的hover属性设置背景颜色 想要实现的效果如下: 但是一开始直接给form加hover选择器的时候是这样: 可以看到这样子直接加会使得 ...

  4. 编译 ijg JPEG V8 库 GIF 库

    libjpeg-turbo-1.2.1太老了,不支持,从内存解压,这里编译支持 jpeg_mem_src 的 JPEG V9 wget http://www.ijg.org/files/jpegsrc ...

  5. 从当当客户端api抓取书评到词云生成

    看了好几本大冰的书,感觉对自己的思维有不少的影响.想看看其他读者的评论.便想从当当下手抓取他们评论做个词云.想着网页版说不定有麻烦的反爬,干脆从手机客户端下手好了.果其不然,找到一个书评的api.发送 ...

  6. Mac Maven安装与配置

    下载 官网地址:http://maven.apache.org/download.cgi 配置环境变量 总步骤 编辑.bash_profile文件 vim ~/.bash_profile 配置mave ...

  7. css中:如何让一个图片(不知道宽高,宽高可能比父元素div大),在父元素div内部水平垂直居中,并且不溢出父元素div,且图片不拉伸变形(可等比例缩小)?

    欢迎进入:http://www.jscwwd.com/article/list/%E5%85%A8%E9%83%A8 效果图: 不管父元素的宽高怎么变化,图片都是水平垂直居中的,并且不溢出父元素. 注 ...

  8. vue依赖注入

    大家可能知道常规组件传值,父传子使用子组件定义好的props值,子传父可以使用子组件里面定义的时间this.$emit(); 然后很多层的情况,一层一层慢慢传太慢,vue提供了依赖注入的钩子:prov ...

  9. ADO.NET 的使用(一)

    一.ADO.NET概要 ADO.NET 是一组向 .NET Framework 程序员公开数据访问服务的类. ADO.NET 为创建分布式数据共享应用程序提供了一组丰富的组件. 它提供了对关系数据.X ...

  10. 1. python跨目录调用模块

    快速镜像安装第三方库 :  pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy (三方库名字) 同目录下,我们可以直接调用模块, ...