C 语言编程 — const 关键字

举报
云物互联 发表于 2021/08/05 23:27:23 2021/08/05
【摘要】 目录 文章目录 目录const 关键字修饰常量修饰指针修饰函数形参修饰函数返回值 const 关键字 const 是 Constant(常量)的简写,有 3 大作用: 修饰常量,说明该常量的数值不可以被改变;修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer);修饰形参,指向常量的...

目录

const 关键字

const 是 Constant(常量)的简写,有 3 大作用:

  1. 修饰常量,说明该常量的数值不可以被改变;
  2. 修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer);
  3. 修饰形参,指向常量的形参(reference to const),用于形参类型,即避免了拷贝,又避免了函数对值的修改;

修饰常量

定义常量:下述两种方式效果一致,通常使用后者。

TYPE const ValueName = value;
// or
const TYPE ValueName = value;

  
 
  • 1
  • 2
  • 3

注:当 conse 定义的常量是一个 “外部连接” 时,可以不进行初始化,仅仅作为声明,编译器认为该常量在程序的其他地方进行了定义。

extern const int ValueName = value;

  
 
  • 1

进行类型检查:const 定义的常量必须具有数据类型,而 #define 定义的宏常量是没有数据类型的。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。所以,强烈建议使用 const 进行常量的定义。

void func(const int i) {}

// 对传入的参数进行类型检查,不匹配时进行提示。

  
 
  • 1
  • 2
  • 3

节省内存空间:避免不必要的内存分配,const 定义的常量从汇编的角度来看,只是给出了对应的内存地址,而不像 #define 那般给出的是立即数,所以,const 定义的常量在程序运行过程中只有一份拷贝,而 #define 定义的常量在内存中有若干个拷贝。

#define Pi1 3.14159 // 常量宏

double I=Pi1; // 编译期间进行宏替换,分配内存
double J=Pi1; // 再进行宏替换,又一次分配内存!

const doulbe  Pi2=3.14159;  // 此时并未将 Pi 放入 ROM 中
double i=Pi2; // 此时为 Pi 分配内存,以后不再分配!
double j=Pi2; // 内存没有再次分配

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

提高了效率:编译器通常不为普通 const 定义的常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

修饰指针

这是一个非常容易造成混淆的写法,不推荐。

  1. 指向常量的指针(pointer to const)
const char* pContent;

  
 
  • 1
  1. 自身是常量的指针(常量指针,const pointer)
char* const pContent;

  
 
  • 1
  • 两者都不可变
const char* const pContent;

  
 
  • 1

区别的方法:以 * 号为分割线

  • const 位于左侧时,const 用于修饰指针所指向的变量,即指针指向为常量;
  • const 位于右侧时,const 用于修饰指针本身,即指针本身是常量。

修饰函数形参

修饰函数的形式参数:防止意外的修改,增强程序的健壮性。即避免了拷贝,又避免了函数对值的修改。在函数中定义形参时,建议使用 const 显式声明一个常量形参,传递过来的实参在函数体是不可以改变的。

  • 传入的参数在函数体内不可以改变
void func(const int i)
{ i = 10; 	// 如果在函数体内修改了 i,编译器就会报错。
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 传入的指针参数所指内容为常量不可变
void function(const char* Var);

  
 
  • 1
  • 传入的指针参数本身为常量不可变
void function(char* const Var);

  
 
  • 1

修饰函数返回值

其实用的并不是很多,它的含义和 const 修饰普通变量以及指针的含义基本相同。

  • 返回一个整型常量
const int fun()

  
 
  • 1
  • 指针函数返回的指针指向的数据为常量不可变
const int* fun()

  
 
  • 1
  • 指针函数返回的指针自身为常量不可变
int* const fun()

  
 
  • 1

文章来源: is-cloud.blog.csdn.net,作者:范桂飓,版权归原作者所有,如需转载,请联系作者。

原文链接:is-cloud.blog.csdn.net/article/details/106866712

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。