const和指针的三种组合

/*
int *const p : p 指针的指向不能改变;(此时理解为const修饰的是p指针)
int const* p / const int* p : p指向的地址空间的取值不能改变;(此时理解为const修饰的是p(理解为取值))
int const* const p : p指向的地址空间取值和指向都不能改变.

编译的时候,如果编译器识别到被const修改的变量a,有代码有修改a的取值,编译会报错; 但是程序运行时,并不关心是不是有const修饰变量,所以const只是一种编译检查代码语法规范的一个机制
被const修饰的变量,对变量地址的指针引用,可以间接的修改变量的取值
*/

#include <stdio.h>

#define CONST_P

#define CONST_STAR_P

int main(int argc, char* argv[])
{
    int const a = 12345678;

    //int const* const a = 12345678;
    //这个才是终结者,a的取值不会被改变, a的指向也不能改变

    //int *p = &a;//类型不匹配

#ifndef CONST_P
    // 此时a的取值还是会被p0指针引用而改变
    int *p0 = (int*)&a;
    *p0 = 100;
#else   
    //此时,p1指针引用了a,虽然p1指针不能改变指向了,但是还是可以通过p1改变a的取值
    int *const p1 = (int* const)&a;

    *p1 = 100;

    #if 0 //p1指针不可改变指向,不然编译报错
        p1 = &b;
    #endif

#endif

#ifdef CONST_STAR_P     
    //此时,即使p2指针引用了a,但是不能改变a的取值,因为const的修饰,p2指向的取值不能改变
    int const* p2 = &a;
    #if 0 //p2指针指向的内容不能改变,不然编译报错
        *p2 = 100;
    #endif
#endif

    printf("a = %d\n", a);

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值