(编程基础)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的最重要作用。


原创粉丝点击