C语言 const 用法

前言

本文介绍 const 的几种使用方式。

正文

  1. const char p 与 char const p 等价, 都是限定了字符类型变量 p 所在的内存数据不可更改。

    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main() {
        const char p;
        char const q;
        p = 'p';
        q = 'q';
        return 0;
    }
    

    在这里插入图片描述

  2. const char *p 与 char const *p 等价,都是限定了指针 p 指向的 字符对象 所在的内存数据不能更改,而指针变量 p 本身所在的内存数据可以修改,即是 p 可以指向其他位置。

    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main() {
        const char *hstr = "hello";
        hstr = "world";  // valid
        hstr[0] = 'i';   // 编译报错,提示 *hstr 被分配到只读的内存位置
        hstr[1] = 'i';   // 编译报错,提示 *(hstr + 1) 被分配到只读的内存位置
        return 0;
    }
    

    g.cn/85a25cbd344845e9bfc6ef70c10b52c6.png)

  3. char * const p 限定了指向字符对象的指针变量所在的内存数据不可更改,即是 p 不能指向其他位置,但是 p 所指向位置的数据可以更改。

    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main() {
        const char *hstr = "hello";
        char * const dst = (char *)malloc(sizeof(hstr) / sizeof(char));
        memcpy(dst, hstr, sizeof(hstr) / sizeof(char)); //valid 修改了 dst 指向的位置的数据
        printf("%s\n", dst);
        char *p;
        dst = p; // 修改 dst 的指向,编译报错,提示 dst 被分配到只读的内存位置
        return 0;
    }
    

    在这里插入图片描述

  4. const char * * p 与 char const * * p 等价,同第一种,只限定了字符对象不可更改,指向该字符对象的地址的指针 p 本身可改动,p 指向的位置所保存数据(存的是该字符对象的地址)也可更改。

    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main() {
        const char * temp = (char *)malloc(5);
        const char ** dst = &temp;
        const char * hstr = "hello";
        dst = &hstr; // valid,dst 本身改动
        *dst = hstr; // valid,dst 指向的位置可更改
        printf("%s\n", *dst);
        (*dst)[0] = 'i'; // 试图更改最终指向的字符对象数据,编译报错,提示 **dst 被分配到只读的内存位置
        (*dst)[1] = 'i'; // 试图更改最终指向的字符对象数据,编译报错,提示 *(*dst+1) 被分配到只读的内存位置
        return 0;
    }
    

    在这里插入图片描述

  5. char * const * p 类似第二种,限定了指向(指向字符对象的指针变量)的指针指向的位置的数据不可更改,即指针 p 本身可以更改,*p 不能更改,**p 可更改。

    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main() {
        char * temp = (char *)malloc(5);
        char * const * dst = &temp;
        char * p;
    
        (*dst)[0] = 'i'; // valid, 更改最终指向的字符对象,即 *(*dst + 0) == **dst
        dst = &p; // valid,更改双重指针 dst 本身 
        *dst = p; // 试图更改 dst 指向的位置的数据,即 *dst,编译报错,提示 *dst 被分配到只读的内存位置
    
        return 0;
    }
    

    在这里插入图片描述

结语

写到后面我也快晕了,可以边看例子边画图来理解。

关键字 const 并不能把变量变成常量!在一个符号前加上 const 限定符知识表示这个符号不能被赋值。也就是它的值对于这个符号来说是只读的,但它并不能防止通过程序的内部(甚至是外部)的方法来修改这个值。const 最有用之处就是用它来限定函数的形参,这样该函数将不会修改实参指针所指的数据,但其他的函数却可能会修改它。 ---- 摘自《C专家编程》

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tobybo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值