const浅析

// age1age2是常量,只读,下面两个写法是相同的
    const int age1 = 20;
    int const age2 = 30;
    
// const的修饰的*p1和*p2,*p1和*p2是常量,不能通过p1、p2指针间接修改其他变量的值,下面p1和p2的写法相同
    const int *p1 = &age;
    int const *p2 = &age;
    
    int num = 30;
    p1 = #
    p2 = #
    
    // 写法错误 *p1 = 40;
    // 写法错误 *p2 = 50;
    
    // const修饰的p3,p3是个常量,p3不能再指向其他变量
    int * const p3 = &age;
    
    // 写法错误
    //        int num = 30;
    //        p3 = #
    
    // 写法正确
    //        *p3 = 30;

 

#include <stdio.h>

/*
 const 使用地方
 
 1)修饰变量
 
 2)修饰指针变量
 
 3)修饰数组
 */

/**
 *  const修饰变量,使得变量变成常量
 */
void test1()
{
    // 使用const修饰变量a
    const int a = 10;
    printf("a = %d
", a); // 10
//    a = 20; // read-only
    printf("a = %d
", a);
}

/**
 *  用指针强制修改const常量
 */
void test2()
{
    // 使用const修饰变量a
    const int a = 10;
    printf("a = %d
", a); // 10
    int *p = &a;
    *p = 100; // 强制修改常量
    printf("a = %d, *p = %d
", a, *p); // 10,100
}

int main(int argc, const char * argv[]) {
    
    int a = 10;
    int b = 20;
    
    // 定义个指针变量,p指向a
    // 此处的const的作用是指针变量p的指向可以改变,但是指向的变量的值
    // 不能改变
    // 1.const修饰的指针变量指向可变,指向的变量的值不可变
    const int *p = &a; // 给p初始化
    p = &b; // 重新修改了p的指向
//    *p = 100; // 错误写法
    
    int const *p1 = &a;
    p1 = p; // p1的指向也是可以改变的
//    *p1 = 100; // p1指向的变量的值时不能改变的
    
    // 2.const修饰的指针变量,指针变量指向的变量值可以改变,指向不能变
    int * const p2 = &a;
    *p2 = 100; // 值可以改变
//    p2 = &b; // p2的指向不能变
    
    // 3.const修饰的指针变量的指向和值,都不能改变
    const int * const p3 = &a;
//    p3 = &b; // 指向不能变
//    *p3 = 100; // 指向的变量的值也不能变
    
    
    printf("a = %d
", a);
    
    /**
     记忆技巧:
        看 const 和 * 的位置
        如果  const 在 *的左侧    表示指针变量指向的变量的值不能变,但是指向可以改变
        如果  const 在 *的右侧    表示指针变量指向的变量的值可以改变,但是指向不就可以改变
        如果  const   出现在 *的两侧,表示指针变量的指向和值都不能改变
     */
    
    return 0;
}
原文地址:https://www.cnblogs.com/521it/p/5017321.html