C语言中const关键字的基本作用和用法

大家看到const关键字, 大多数人会不会认为它是一个const常量, 我告诉大家这是错误的认知, 那么它实际的意义是什么呢? 其实const不能把变量变成常量, 而是把一个变量, 变成了一个只读变量, 所以我们不能直接修改它的值, 但是我们可以通过它的地址, 来修改它的值.

1. const的普通用法

// const int n = 5;

int const n = 5; // 这两句话的作用是一样的, 都是声明了一个名为a的只读变量, 我们不可以直接修改a的值.

int a[n] = {1, 2, 3, 4, 5}; // 要求数组的大小是一个常量, 也就是说是一个确定的值, 而n是一个只读变量, 也就是说在n初始化时就有了一个确定的值, 所以可以用来当作数组的大小

2. const用于指针

int a = 5;

int b = 10;

//const int * p = &a;

int const * p = &a; // 这两句话的作用也是一样的, 都是声明了一个名为p的常量指针, 也就是说p所对应的存储空间是只读的, 我们不能通过p来改变其中的内容

p = &b; // 正确的写法

*p = 20; // 错误的写法, 因为const修饰是*p, 所以*p是只读的, 我们不能向只读的存储空间中写入数据(p所指向的b是一个变量, 而不是一个常量, 但是这也不行)

b = 20; // 正确的写法, 因为b是一个变量, 没有const修饰b

---------------------------------------------------------------------------------------

int * const q = &a; // 作用: const位于*的右侧, 声明q是一个指针常量

q = &b; // 错误的写法, q是一个只读的指针变量, 我们不可以对其重新赋值

*q = 20; // 正确的写法, 因为*q前并没有const修饰, 所以q指向的存储空间还是可读写的, 所以*q是一个变量, 而不是一个常量, 我们可以通过q来修改对应存储空间中的内容

b  = 20; // 正确的写法

大家要看一下const所在的位置是不同的, 所以起到的作用也是不同的, 大家要多我思考. 总结: 1. const在*左侧, 则不能改的是*p, 也就是说不能这样赋值: *p = 20; 2. const在*右侧, 则不能改的是p, 也就是说不能这样赋值: p = &b;

3. const的几种情况:

1)

int main() {

  const int a = 5;

  int * p = (int *)&a;

  *p = 10;

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

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

}

// 我们发现打印出来a是值是5, *p的值是10. 为什么会出现这样的情况呢? 难道是存储空间会存储不同的两个值? 当然不会, 因为编译器在预处理时, 只对const修饰的变量值读取一次, 所以打印出来a是5, 实际上我们通过指针变量p改变了a的值, 所以实际上a的值是10. 总结: 1. const修饰的局部变量存储在堆栈中, 我们可以通过指针修改它的值. 2. 编译器只对const修饰的变量的值读取一次, 就是在预处理的时候. 3. 如果a是一个const修饰的全局变量, 则这样写就不可以了, 因为它的值是存储在全局存储空间中, 其值只有可读属性, 不能修改.

也就是说下面这样写是不可以的:

const int a = 5;

int main() {
  int * p = (int *)&a;

  *p = 10; // 这样写就是错误的了.

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

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

}

2)

int a = 5;

int b  =10;

const int * const p = &a; // 指针本身和指针所指向的存储空间都是只读的.

p = &b; // 错误的写法, 因为p前面有const修饰, 所以p是一个指针常量, 也就是说p的值是不能被重新赋值的.

*p = 20; // 错误的写法, 因为*p前面有const修饰, 所以*p是一个常量, 也就是说p是一个常量指针, 它所指向的存储空间是只读的.

// ok, const的基本使用就说到这里, 大家可以回过头去对比一下, 认真思考, 相信会有不小的收获...

时间: 2024-08-04 12:35:32

C语言中const关键字的基本作用和用法的相关文章

C语言中const关键字的用法

转载请注明出处http://blog.csdn.net/xingjiarong/article/details/47282255 关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变,我想一定有人有这样的疑问,C语言中不是有#define吗,干嘛还要用const呢,我想事物的存在一定有它自己的道理,所以说const的存在一定有它的合理性,与预编译指令相比,const修饰符有以下的优点: 1.预编译指令只是对值进行简单的替换,不能进行类型检查 2.可以保护被修饰的东

C语言中static关键字的作用

static的作用(精辟分析) 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)先来介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性.为理解这句话,我举例来说明.我们要同时编译两个源文件,一个是a.c,另一个是main.c. 下面是a.c的内容 char a = 'A'; // global variable void msg()  {     printf("Hello\n"

C语言中const有什么用途

const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的. const关键字的作用主要有以下几点: (1)可以定义const常量,具有不可变性. 例如: const int Max=100; int Array[Max]; (2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患.例如: void f(const int i) { .........} 编译器就会知道i是一个常量,不允许修改: (3)可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改.(

C语言中extern关键字的用法

转载请注明出处http://blog.csdn.net/xingjiarong/article/details/47614171 利用关键字extern,可以在一个文件中引用另一个文件中定义的变量或者函数,下面就结合具体的实例,分类说明一下. 一.引用同一个文件中的变量 #include<stdio.h> int func(); int main() { func(); //1 printf("%d",num); //2 return 0; } int num = 3; i

C语言中const的用法

const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助. 我们来分情况看语法上它该如何被使用. 1.函数体内修饰局部变量. 例: void func() { const int a=0; } 首先,我们先把const这个单词忽略不看,那么a是一个int类型的局部自动变量,我们给它赋予初始值0.然后再看const. const作为一个类型限定词,和in

C语言中的errno(错误报告)用法

C语言标准库中的错误报告用法有三种形式. 1.errno errno在<errno.h>头文件中定义,如下 #ifndef errno extern int errno; #endif 外部变量errno保存库程序中实现定义的错误码,通常被定义为errno.h中以E开头的宏, 所有错误码都是正整数,如下例子 # define EDOM 33 /* Math argument out of domain of function. */ EDOM的意思是参数不在数学函数能接受的域中,稍后的例子中用

C语言中Static和Const关键字的的作用

程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中. 1.作用于变量: 用static声明局部变量-------局部变量指在代码块{}内部定义的变量,只在代码块内部有效(作用域),其缺省的存储方式是自动变量或说是动态 存储的,即指令执行到变量定义处时才给变量分配存储单元,跳出代码块时释放内存单元(生命期).用static声明局部变量时,则改变变量的存储方式(生 命期),使变量成为静态的局部变量,即编译时就为变量分配内存,直到程序退出才释放存储单元.这样,使

C语言中volatile关键字的作用

一.前言 1.编译器优化介绍: 由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问.另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度.以上是硬件级别的优化.再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化.编译器优化常用的方法有:将内存变量缓存到寄存器:调整指令顺序充分利用CPU指令流水线,常见的是重新排序读写指令.对常规内存进行优

iOS开发中Static和Const关键字的的作用

1.作用于变量: 用static声明局部变量时,则改变变量的存储方式(生命期),使变量成为静态的局部变量,即编译时就为变量分配内存,直到程序退出才释放存储单元.这样,使得该局部变量有记忆功能,可以记忆上次的数据,不过由于仍是局部变量,因而只能在代码块内部使用(作用域不变). 用static声明外部变量-------外部变量指在所有代码块{}之外定义的变量,它缺省为静态变量,编译时分配内存,程序结束时释放内存单元.同时 其作用域很广,整个文件都有效甚至别的文件也能引用它.为了限制某些外部变量的作用