经典C语言面试题7:const关键字的作用

一、const关键字简介

    const是单词constant的简写,若一个变量前用const修饰,就意味着该变量里的数据可以被访但不能被修改,即该变量是“只读”的。

二、const关键字的用法

    1. 用于修饰局部变量

        例如:

const int n = 5;
int const n = 5;/*二者是等价的,均表示变量n的值不能被改变了*/

       注意:在使用const修饰变量时,一定要给变量初始化,否则之后就不能赋值了!

   2. 常量指针与指针常量

      常量指针 是说指针指向的内容是常量,例如:

const int *n;
int const *n; /*二者等价*/

     注1:常量指针是说不能通过这个指针改变变量的值,但是可以通过其他引用来改变变量的值,例如下面这种:

int a = 5;
const int *n = &a;
a = 6;

     注2:常量指针的值不能改变,但这不意味着指针本身不能改变,常量指针可以指向其他的地址,例如下面这种:

int a = 5;
int b = 6;
const int *n = &a;
n = &b;

      指针常量 是说指针本身是个常量,不能再指向其他的地址,例如:

int * const n; /*指针常量*/

      注:指针常量指向的地址不能改变,但是地址中保存的数值是可以改变的,可以通过其他指向该地址的指针来修改,例如:

int a = 5;
int *p = &a;
int * const n = &a;
*p = 8;

  常量指针、指针常量一会儿就把人绕晕了,那么如何区分他们呢?别急,请往下看。

  一个简单的方法是看 * 的位置,如果我们将 * 读作“指针”,将 const 读作“常量”的话,则正好可以根据二者的前后顺序来辨别,例如:

int const *n; /*是常量指针*/
int * const n;/*是指针常量*/

      指向常量的常指针:指针指向的位置不能改变且也不能通过这个指针改变变量的值。(但是仍然可以用其他的普通指针改变变量的值)

const int * const p;/*指向常量的常指针*/

   3. const修饰函数的参数

       1)防止修改指针指向的内容,如:

void StringCopy(char *dst, const char *src);

     2)防止修改指针所指向的地址,如:

void swap(int * const p1, int * const p2);

  4. const修饰函数的返回值

      例如,若有如下函数:

const char* GetString(void);

     当用以下语句来接收函数返回值时将出错:

char *str = GetString(); /*错误*/

      应当改写为:

const char *str = GetString(); /*正确*/

三、const与宏定义#define的区别

  1. 宏定义只是对值进行简单的替换,不进行类型检查;而const有具体的类型,在编译阶段会进行类型检查
  2. #define宏是在预处理阶段展开,而const常量在编译运行阶段
  3. const定义的常量在程序的运行过程中只有一份拷贝(因为是全局的只读变量,故存在静态区);而#define定义的常量在内存中有若干个拷贝   
  4. const效率高,因为编译器通常不为普通const常量分配内存,而是保存在符号表中,没有了存储与读取的操作,效率很高

------------------------------------------------The end------------------------------------------------------

你可能感兴趣的:(C语言基础&面试常见问题)