注意:C语言中的const和C++中的const是有区别的,而且在使用VS编译测试的时候。如果是C的话,请一定要建立一个后缀为C的文件,不要是CPP的文件。因为,两个编译器会有差别的。

一、C语言中的const比较常见的用法,const做常量

#include

#include

#include

/*

C中的const用法(使用VS测试的时候,要注意建立一个C后缀的文件,因为C的编译器和C++的编译器还是有区别的)

*/

//const用作常量,int const a和const int a是一个意思都是表示常量,可以通过指针来改变常量的值

void test1(){

const int a = 10;

int* p = &a;

*p = 20;

printf("p:%d\n",*p);

printf("a:%d\n",a);

}

通过上面的例子,我们可以发现在C语言中,当使用const作为常量的时候,其实我们是可以通过指针,进行间接赋值从而改变常量的值。如果,上面的例子是在C++编译器中,int* p = &a,这句话会在编译的时候报错,当然你可以通过强转int* p = (int*)&a,强转之后指针p还是无法间接改变常量的值,这一点我也觉得很奇怪,明明指针p指向的是常量a,但是却无法改变a的值,打印的时候会出现两个不同的值。有网友说,那是因为汇编代码中a就代表10,也就是说,在汇编代码中a是直接用10代替了。

二、C语言中的const作为指针使用的时候

//const用法作为指针,const char* a,表示a是一个指向常量的一个指针,即常量的内容不能改变,但是指针a(a的值并不是a指向的常量)可以改变

// char* const a就表示a是一个指针常量,即内容可以改变,但是指针a不能改变

void test2(){

const char* a = NULL;

a = "ABCD";//编译通过,运行不会报错,因为这里改变的是指针a,这里改变的并不是常量。这句代码会为字符串"ABCD"在全局区中开辟一块空间,

//然后把字符串的首地址赋值给a

//*a = 'a';//编译报错,因为内容是不可以修改的

char* const b = NULL;

*b = "abcde";//编译通过,因为内容可以修改

//b = "aab";//编译报错,因为指针变量是一个常量,不能被修改

const char* const c = "abcd";//内容和指针变量都不能被修改

}

C语言中的细节是非常多的,所以一定要注意一下这些细节,如果想学好C语言一定要了解C语言的内存四区,考虑问题的时候从内存四区的角度去思考问题。

三、下面再介绍一个关于C语言中free函数的使用

/*

c语言中free

1、C语言中的free是用来释放内存空间的,释放的是指针所指向的内存空间,释放完之后记得将指针赋NULL,避免出现野指针

2、在C语言中使用free方法的时候要特别注意,如果没有释放好可能会导致宕机,原因是有的内存空间是不能被释放的,如常量区

*/

void testp1(){

//给指针开辟空间的时候,要养成一个良好的习惯

//声明指针的时候,记得赋NULL

char* p1 = NULL;

p1 = (char*)malloc(10);//p1中的内存是在堆中开辟的

p1 = "abcdef";

printf("p1:%s\n",p1);

//释放内存的时候,先要判断是否为NULL,释放完之后记得给指针赋NULL,避免野指针

if (p1 != NULL){

free(p1);

//如果,不赋NULL,释放之后不小心再使用p1的时候就会宕机

//因为,指针p1所指向的内容已经被释放掉了,而p1并不为空,却指向了一个不能被这个程序使用的空间,所以导致了宕机,而p1就成了一个野指针

printf("p1:%d",p1);//这代码会导致宕机

p1 = NULL;

}

}

//下面的程序也会导致宕机,因为,free不能释放常量区中的内存

void testp2(){

char* p2 = "abcdef";//"abcdef"字符串是存放在常量区中的

if (p2 != NULL){

free(p2);

p2 = NULL;

}

}

free函数不能释放全局区的内存,也不能释放数组的空间,如(char a[2]={'a'}),都会导致宕机。

四、最后再介绍一下C语言中的数组比较容易犯的错误

void main(){

//编译报错,初始值设定项太多,因为,在c语言中编译器会自动添加\0表示结束符,所以实际上a的大小是6,但只定义了5个所以导致编译报错

char a[5] = {'a','b','c','d','e'};

//测试数组大小用sizeof(a)是表示数组的所占内存空间的大小5*sizeof(char)

}

以上所述是小编给大家分享的C语言中的const和free用法详解,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的,在此也非常感谢大家对脚本之家网站的支持!

c语言常量的正确表示const,C语言中的const和free用法详解相关推荐

  1. 以下关于c语言中static和const,c语言中static const作用

    c语言中static const作用 (2012-06-21 07:51:08) 标签: it 关键字static: 1. 在函数体内,一个被声明为静态的变量在这一个函数被调用的过程中维持其值不变. ...

  2. c语言中如何正确使用union,C语言中的union使用方法

    共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量. 在union中,全部的共用体成员共用一个空间. 而且同一时间仅仅能储存当中一个成员变量的值. 1.union中能够 ...

  3. c语言printf族函数,C语言中的printf族函数深入详解

    使用manpages(man 3 printf)查看到的printf函数如下定义: #include int printf(const char *format,...); int fprintf(F ...

  4. C语言估算数学常量e,c语言常量的正确表示方法有哪些

    c语言常量的正确表示方法有哪些 C语言中的数值常量可以简单的分为如下两种整型常量和浮点数常量: 一.整型常量 如6,27,-299 在 C 语言中,整型常量分为十进制整型常量.八进制整型常量和十六进制 ...

  5. C语言字母常量所对应的数字,关于c语言常量的正确表示方法介绍

    关于c语言常量的正确表示方法介绍 发布时间:2020-04-21 11:40:05 来源:亿速云 阅读:938 作者:小新 今天小编给大家分享的是关于c语言常量的正确表示方法介绍,相信很多人都不太了解 ...

  6. c语言常量指数的正确表示,c语言常量的正确表示方法有哪些

    c语言常量的正确表示方法有哪些 C语言中的数值常量可以简单的分为如下两种整型常量和浮点数常量: 一.整型常量 如6,27,-299 在 C 语言中,整型常量分为十进制整型常量.八进制整型常量和十六进制 ...

  7. C语言高频率--typedef和const用法详解

    一.typedef用法详解 C语言允许为一个数据类型起一个新的别名,就像给人起"绰号"一样. 起别名的目的不是为了提高程序运行效率,而是为了编码方便.例如有一个结构体的名字是 st ...

  8. c语言fputc 函数头,简单对比C语言中的fputs()函数和fputc()函数

    简单对比C语言中的fputs()函数和fputc()函数 C语言fputc()函数:写文件函数(将一指定字符写入文件流中) 头文件: #include 定义函数: int fputc(int c, F ...

  9. sizeof 在C语言的作用,C语言中的sizeof的用法详解

    C语言中的sizeof的用法详解 一.sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等.它并不是函数.sizeof操作符以字节形式给出了其操作数的存储大小.操 ...

最新文章

  1. 领域驱动设计 敏捷_反馈失败:发现敏捷数据驱动的致命弱点的风险
  2. 深度学习有哪些经典数据集?
  3. win10软件拒绝访问删不掉_进程拒绝访问怎么结束_win10关闭进程拒绝访问的处理方法...
  4. 通达信指标能用c语言编写吗_翔博精选指标看长做短,引用周线数据(通达信公式 副图 源码 测试图)...
  5. Linux - 网络相关指令
  6. babel7中 preset-env 完全使用
  7. EasyX实现推箱子游戏
  8. 走出舒适圈,从来都不简单
  9. Set集合存储元素不重复的原理
  10. mysql 关联查询_mysql数据库调优(二)
  11. 洛谷P1182 数列分段 Section II(二分+贪心)
  12. 关于平方根倒数速算法(雷神之锤3,牛B)
  13. Logs Viewer
  14. mysql exporter怎么配置_prometheus mysqld_exporter监控mysql-5.7
  15. Qt —— QWebEngineView加载谷歌离线地图(包含离线地图瓦片下载制作)
  16. Unity翻译工具(使用百度翻译)
  17. python死循环_Python for死循环
  18. irr内部收益率php,内部收益率(IRR)
  19. CentOS7和CentOS8 FreeSWITCH 1.10.7 简单图形化界面20--FreeSWITCH通过域名注册
  20. CSDN文章点赞、收藏、评论后到底发生了什么?简要分析HTTP交互机制

热门文章

  1. 从并发模型看 Go 的语言设计
  2. 腾讯GaiaStack容器平台负责人罗韩梅:All on GaiaStack
  3. GitHub--创建新的分支
  4. leetcode 714. Best Time to Buy and Sell Stock with Transaction Fee | 714. 买卖股票的佳最时机含手续费(递归->傻缓存->dp)
  5. leetcode 54. Spiral Matrix | 54. 螺旋矩阵(Java)
  6. C# int.Parse()与int.TryParse():将字符串转化为整数
  7. nodejs中使用worker_threads来创建新的线程
  8. Spring5参考指南:Bean的创建
  9. java php python 高并发_关于php如何调用Python快速发送高并发邮件的示例代码
  10. MySQL中的索引详讲