注意:C语言中的const和C++中的const是有区别的,并且在使用VS编译測试的时候。

假设是C的话。请一定要建立一个后缀为C的文件。不要是CPP的文件。

由于。两个编译器会有区别的。

一、C语言中的const比較常见的使用方法。const做常量

#include<stdio.h>
#include<malloc.h>
#include<string.h> /*
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语言中的数组比較easy犯的错误

void main(){
//编译报错,初始值设定项太多,由于,在c语言中编译器会自己主动加入\0表示结束符,所以实际上a的大小是6,但仅仅定义了5个所以导致编译报错
char a[5] = {'a','b','c','d','e'};
//測试数组大小用sizeof(a)是表示数组的所占内存空间的大小5*sizeof(char)
}

C语言中的const,free使用方法具体解释的更多相关文章

  1. C++笔记十七:C语言中 “冒牌货”const和const符号表

      在.c文件中有程序: int main() { int const a = 10; a=20; printf("a=%d\n",a); return 0; } 编译就知道C语言 ...

  2. c语言中的const的作用及解析

    有时候我们希望定义这样一种变量,它的值不能被改变,在整个作用域中都保持固定.例如,用一个变量来表示班级的最大人数,或者表示缓冲区的大小.为了满足这一要求,可以使用const关键字对变量加以限定: co ...

  3. C语言中malloc函数的使用方法

    C语言中malloc是动态内存分配函数.函数原型:void *malloc(unsigned int num_bytes);参数:num_bytes 是无符号整型,用于表示分配的字节数.返回值:如果分 ...

  4. C语言中的const

    今天探讨const,首先来说是将变量常量化.为什么要将变量常量化,原因有诸多好处有诸多.比如可以使数据更加安全不会被修改! 但是这个词有几个点要注意,那就是他究竟修饰了谁? 1.const int a ...

  5. R语言中Fisher判别的使用方法

    最近编写了Fisher判别的相关代码时,需要与已有软件比照结果以确定自己代码的正确性,于是找到了安装方便且免费的R.这里把R中进行Fisher判别的方法记录下来. 1. 判别分析与Fisher判别 不 ...

  6. Django模板语言中的Filters的使用方法

    Filters可以称为过滤器.下面我们简单介绍是如何使用他的. Filters的语法: {{ value|filter_name:参数 }} Django大概提供了六十个内置过滤器,下面我们简单介绍几 ...

  7. C语言中的const用法

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

  8. Linux-C语言中gettimeofday()函数的使用方法(转载)

    1.简介: 在C语言中可以使用函数gettimeofday()函数来得到时间.它的精度可以达到微妙 2.函数原型: #include<sys/time.h> int gettimeofda ...

  9. linux下C语言中的flock函数使用方法 .

    表头文件  #include<sys/file.h> 定义函数  int flock(int fd,int operation); 函数说明  flock()会依參数operation所指 ...

随机推荐

  1. Atitit.收银系统pos 以及打印功能的行业标准

    Atitit.收银系统pos 以及打印功能的行业标准 1. ESC指令序列 Escape指令序列不同于ESC/POS指令 1 2. 打印标准OPOS POSPrinter 与 CashDrawer 驱 ...

  2. Atitit.跨语言反射api 兼容性提升与增强 java c#。Net  php  js

    Atitit.跨语言反射api 兼容性提升与增强 java c#.Net  php  js 1. 什么是反射1 1.1.       反射提供的主要功能:1 1.2.       实现反射的过程:1 ...

  3. C++语言基础(13)-抽象类和纯虚函数

    一.基本语法 在C++中,可以将虚函数声明为纯虚函数,语法格式为: ; 纯虚函数没有函数体,只有函数声明,在虚函数声明的结尾加上=0,表明此函数为纯虚函数. 最后的=0并不表示函数返回值为0,它只起形 ...

  4. UML类图详解_关联关系_多对一

    首先先来明确一个概念,即多重性.什么是多重性呢?多重性是指两个对象之间的链接数目,表示法是“下限...上限”,最小数据为零(0),最大数目为没有设限(*),如果仅标示一个数目级上下限相同. 实际在UM ...

  5. 试题系列四(袋中有6红球 3黄球 3绿球,从中取6个球,求所有拿到球的颜色的可能 c(12,6))

    1.袋中有6红球 3黄球 3绿球,从中取6个球,求所有拿到球的颜色的可能 c(12,6) #include<stdio.h> int main(int argc, char** argv) ...

  6. nyoj304 节能

    节能 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 Dr.Kong设计的机器人卡多越来越聪明.最近市政公司交给卡多一项任务,每天早晨5:00开始,它负责关掉ZK大道右侧 ...

  7. 小米Note全网通支持7模19频:先发标准版

    2015-06-26 16:42:53 17749 次阅读 9 次推荐 稿源:安卓中国 43 条评论 感谢安卓中国的投递 自古一入电信深似海,从此手机没法买.现在首台全网通小米手机即将诞生.6 月 2 ...

  8. php 字符串截取

    $str="3,22,11,444,33,1,3455,33,22,444,55,66,77,88,99,554336,"; echo substr($str,0,strlen($ ...

  9. 学习spring2--跟我一起学Spring 3(3)–使用Spring开发第一个HelloWorld应用

    http://www.importnew.com/13246.html     首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 我要投稿 更多频道 » - 导航条 - 首页 所有文章 资讯 ...

  10. 通过Bag一对多映射示例(使用xml文件)

    如果持久化类具有包含实体引用的列表对象,则需要使用一对多关联来映射列表元素. 我们可以通过列表(list)或包(bag)来映射这个列表对象. 请注意,bag不是基于索引的,而list是基于索引的. 在 ...