【C】第4天 认识const限定符,以及它的乱糟糟用法

const限定符 Const

CON-1 不能修改的变量

ANSI C中允许声明const常量,它们的语法与变量几乎一样,但显著区别是const常量一经初始化之后便不允许再次修改。
使用const关键字修饰声明,使其成为一个const常量:

const int a = 1;
int const a = 1;

以上两种声明的作用是相同的,声明了一个int型的常量,它的值不能修改。a不能在后续的代码中进行再次赋值,因此需要在声明时进行初始化。

CON-2 指针与const

当涉及到指针时,注意到这里同时存在两个对象:指针指向的变量指针变量,而它们都可以被声明为const常量。
首先,根据上面const常量a的声明,不难推测,指向const常量的指针的声明可以是:

const int *pa = &a;
int const *pa = &a;

声明了pa,作为一个指向const int类型的指针,pa的值是可变的(因为作为一个指针,可以通过赋值来使其指向另一个const int类型的常量)。对pa进行解引用,得到的是一个不允许修改的const常量,因此不允许通过解引用此指针来修改a
有趣的是,指向const常量的指针并没有规定必须指向一个const常量。观察下面的例子中的常量指针:

#include <stdio.h>
int main(void){
    int a = 5;
    const int *pa = &a;
    printf("a == %d\n",*pa);
    a = 10;
    //*pa = 20;错误!表达式必须是可修改的左值
    printf("now,a == %d\n",*pa);
    return 0;
}

输出为:

a == 5
now,a == 10

pa是一个指向const int型的指针,但它实际上指向一个普通的int型变量。因此int型变量可以通过其他的方式进行赋值,但不能通过解引用*pa赋值。
因此,这样用一个指向const常量的指针指向一个非const常量的意义是:不希望通过解引用此指针的形式改变指向的变量。这个看似奇怪的用法在函数传参中往往非常实用。

  • 在《C++ Primer》这本书中将这种情况形象的比喻为:指向const常量的指针其实是一种“自以为是”,它认为自己指向的是const常量,所以很自觉地不去改变所指对象的值。

现在再回来看看作为const常量的指针。

int a_int=1,b_int=2;
int * const p_const = &a_int;
//p_const = &b_int;错误!表达式必须是可修改的左值
printf("*p_const == %d\n",*p_const);
(*p_const)++;
printf("now,*p_const == %d",*p_const);

此时指针p_const是一个常量,但它指向一个普通的int变量。因此,p_const的值是不可修改的,或者说不能再次使其指向其他的变量。*p_const解引用得到普通的int,可以用(*p_const)++;修改。

最后,也可以将两者都声明为常量:

const int * const p = &a; 

指针无法被修改,也无法通过解引用这个指针来修改指针指向的变量的值。

CON-3 函数与const

前面提到,const可以确保一个变量不被修改,指向const的指针可以确保指向的变量不会被此指针解引用修改。当你想要向函数传递一个指针,但又不希望这个函数意外地(一般是程序编写者的疏忽)修改了原先的变量,在形参列表中添加上const是一种很不错的选择。

#include <stdio.h>
int *maxnum(const int* nums, int numsSize);
int main(void){
    int nums[10] = {3,5,6,45,67,4,23,5,4,1};
    int *p = maxnum(nums,10);
    printf("max num in array nums[10] is %d\n",*p);
    return 0;
}
int *maxnum(const int* nums, int numsSize) {
    int max = 0;
    const int *p = NULL;
    for(int i=0;i<numsSize;i++){
        if(nums[i]>max)
        {
            max = nums[i];
            p = &nums[i];
        }   
    }
    //*p = 0;编译错误:p是const int *
    //nums[1]=10;编译错误:nums是常量数组
    return p;
}

在这个例子中,借助于const的限制,成功预防了函数maxnum意外修改主函数中nums数组的元素。

注:这几天都被学校抓去社会实践了,没时间好好写笔记了X﹏X

本系列博客为我本人原创的学习笔记,尽量勤更新,如有错误欢迎各位大佬指出,Thanks♪(・ω・)ノ

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值