C 语言编程 — const 关键字

目录

const 关键字

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

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

修饰常量

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

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

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

extern const int ValueName = value;

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

void func(const int i) {}

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

节省内存空间:避免不必要的内存分配,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; 				// 内存没有再次分配

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

修饰指针

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

  1. 指向常量的指针(pointer to const)
const char* pContent;
  1. 自身是常量的指针(常量指针,const pointer)
char* const pContent;
  • 两者都不可变
const char* const pContent;

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

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

修饰函数形参

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

  • 传入的参数在函数体内不可以改变
void func(const int i)
{
     i = 10; 	// 如果在函数体内修改了 i,编译器就会报错。
}
  • 传入的指针参数所指内容为常量不可变
void function(const char* Var);
  • 传入的指针参数本身为常量不可变
void function(char* const Var);

修饰函数返回值

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

  • 返回一个整型常量
const int fun()
  • 指针函数返回的指针指向的数据为常量不可变
const int* fun()
  • 指针函数返回的指针自身为常量不可变
int* const fun()

猜你喜欢

转载自blog.csdn.net/Jmilk/article/details/106866712