(编程基础)c语言const浅析
来源:互联网 发布:ubuntu lts 升级 编辑:程序博客网 时间:2024/05/29 04:17
一个面试官问你const的作用,如果你回答“可以把变量变成常量”,那么你差不多就被pass掉了。
在一个符号前加上const限定符只是表示这个符号不能被赋值,也就是说这个值对应这个符号来说是只读的,但是并不能防止通过程序的内部来修改这个值,给个简单的例子如下:
#include <stdio.h>int main(){ const int n = 1; printf("before n = %d\n", n); int *p = &n; *p = 2; printf("after n = %d\n", n); return 0;}测试结果如下:
cheny.le@cheny-ThinkPad-T420:~$ ./a.out
before n = 1
after n = 2
我们可以看到const限定的变量n的值被改变了,所以说const的作用是把变量限定成常量是错误的。
既然不能把变量变成常量,那么const的作用只能限定符号只读吗?其实const最重要的作用是用它来限定函数的形参,这样子该函数将不会修改实参指针所指向的数据,但其他的函数却可能会修改它。
#include <stdio.h>void swap(int *a, int *b){ int temp = *a; *a = *b; *b = temp;}int main(){ int a = 1; int b = 2; swap(&a, &b); printf("a = %d, b = %d\n", a, b); return 0;}测试结果如下:
cheny.le@cheny-ThinkPad-T420:~$ ./a.out
a = 2, b = 1
我们可以发现swap函数的形参可以修改实参&a,&b指针所指向的数据,这个有时候会产生副作用的(这个例子举的不太好,这个例子就是要这个“副作用”,不过太经典了,不小心就贴上来了。。),如果我们不想修改a和b的值,那么我们要怎么办呢?
我们只需要修改swap参数的属性即可:
void swap(const int *a, const int *b)
这样子在swap函数里面企图修改*a和*b的值就会出错,这个在编译阶段就能发现问题了,有助于debug,错误信息如下:
test1.c: In function ‘swap’:
test1.c:6: error: assignment of read-only location ‘*a’
test1.c:7: error: assignment of read-only location ‘*b’
这种写法能增强程序的稳定性,是一种良好的coding style,例如libc里面都是这样子做的:
char *strcpy(char *dest, const char *src);int strcmp(const char *s1, const char *s2);char *strstr(const char *haystack, const char *needle);strcpy的第一个参数是*dest,就是需要拷贝*src所指向的值,所以不能加上const限定符,*src指针所指向的值在strcpy里面是不需要被改变的(这个纯粹看实现者的意图),所以有加上一个const限定符,任何试图修改*src指针所指向的值都是错误的,所以为了程序的健壮性,如果不需要修改指针所指向的值的话,最好加上const限定符,这就是const的最重要作用。
- (编程基础)c语言const浅析
- C语言中 const浅析
- C语言const,extern,static 浅析
- c语言基础之const
- C语言基础-const用法
- [C]C语言基础巩固专题----const
- C语言编程基础
- c语言基础编程
- 程序基础C语言常量(const)参数
- C/C++语言基础_static,const,sizeof
- c语言基础--编程基础
- C++const用法浅析
- C/C++ const 浅析
- 浅析C++const
- (编程基础)c语言递归
- c语言socket编程(基础)
- C语言基础编程(switch语句)
- C语言(关键字const)
- IOS开发键盘弹出时遮住输入框的问题的一种解决方法。
- http://www.blogjava.net/chunkyo/archive/2007/01/16/94266.html
- Win 32 多线程程序设计学习笔记之五:终止线程
- android listview item点击失效问题
- 索引设计原则
- (编程基础)c语言const浅析
- C#中属性的简单介绍
- golang的 IntelliJ Idea插件 google-go-lang-idea-plugin 编译方法 build in windows
- C语言 - 强制转换问题
- MySQL分区表的使用
- python学习
- ubuntu(linux)上ultraedit反复试用的方法
- CSDN以前博客中的照片不显示了,为什么
- Ubuntu12.04源列表