const
最近一直在阅读 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 可以很好的检查某些变量被人为的修改!