最近一直在阅读 Linux 内核源代码,发现 const 用处很多,不禁感叹 Linux 内核代码真是把 C 语言应用的淋漓尽致!今天就专门对 const 的用法进行一下分析!

const的作用就不说了,地球人都知道!

(一)

直接看代码:

int a=10;
   a=9;
   

以上两句史上最简单的代码肯定编译通过!再看……

const int a 10;

   a=9;
   

再次编译就通不过了吧!因为变量a已经限定为 const 常量,不能改变a的值!

注意:

在声明一个 const 变量时可以为它赋初值!

const int a;

   a=10;
   

此时编译再次报错,不能对一个只读变量赋值!此时若输出 a 的值为一个随机值,因为变量 a 在栈中!不信你看:

const.c

int main(void)
   {
      const int a=10;
   }
   

gcc –S const.c

vim const.s

.file   "const.c"
           .text
   .globl main
           .type   main, @function
   main:
           leal    4(%esp), %ecx
           andl    $-16, %esp
           pushl   -4(%ecx)
           pushl   %ebp
           movl    %esp, %ebp
           pushl   %ecx
           subl    $16, %esp
           movl    $10, -8(%ebp)
           addl    $16, %esp
           popl    %ecx
           popl    %ebp
           leal    -4(%ecx), %esp
           ret

           .size   main, .-main
           .ident  "GCC: (GNU) 4.1.2 20080704 (Red Hat 4.1.2-48)"
           .section        .note.GNU-stack,"",@progbits
   

注意 12-13 行,at&t 的汇编代码 不用解释了吧 。。。。。。你懂的

(二)

const 在内核代码中几乎全部用在了指针变量上!让我们继续分析!

1)

int a=10;

   const int *p=&a;

   *p=9;
   

编译报错!指针 p 指向的变量为只读变量!作用就是限制指针对变量进行修改。

注意:指针 p 的值是可以改变的!

例如:

int a=10;

   int b=9;

   const int *p=&a;

   p=&b;
   

编译运行成功!

2)

int a=10;

   int b=9;

   int * const p=&a;

   p=&b;
   

编译失败!const 限制 指针变量 p 为只读变量,所以同样不能改变它的值!

总结一下:

C 中 const 用法很巧妙,运用 const 可以很好的检查某些变量被人为的修改!