(编程基础)c语言const浅析

一个面试官问你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的最重要作用。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值