C语言基础--深入理解指针常量和常量指针的前世今生

本文将要讲到的是关于指针常量和常量指针!
平时我们会经常 见到以下几种类型:

 * 1const int a;
 * int const a;
 * 
 * 2const int *p;         
 * int const *p;        //
 * 
 * 3int *const p;         
 * 
 * 
 * 4const int  *const p;  

上面代码中的1234对应的概念
1)用const修饰一个变量,意思是将这个变量常量化
2)常量指针:表示指针的指向可以发生变化,但是指针中的目标变量不能发生变化
3)指针常量:表示指针的值可以发生变化,但是指针指向的地址不能发生变化
4)有两个const修饰的,表示指针的值不能发生变化,指针指向的地址也不能发生变化

既然已经可以用宏定义了,那为什么要用const类型???
答:虽然宏定义可以表示常量,且在预处理时编译器会将宏定义替换,但是宏定义有一个致命的缺点就是不检查语法,如果用const类型来修饰一个变量,就可以将这个变量常量化,并且还可以检查语法

1)宏定义不检查语法
比如
#define PI	3.14这样是可以
但是
#define PI  ABCD这样也是可以的
这就有个致命的缺点,宏定义不会检查语法

2)改为const类型修饰
const float pi = 3.14; 这样就可以检查语法了,并且pi的值也不能被直接修改

那const类型修饰的变量的值可以被修改吗?
答:可以,请参考下面代码

/*
 * @Description: 
 * @Author: Mr.Lan
 * @Date: 2020-12-05 11:27:27
 * @LastEditTime: 2020-12-05 11:39:17
 * @LastEditors: Mr.Lan
 */
#include 
#include 

int main()
{
    const float pi = 3.14;
    float *p = π
    *p = 3.14159;
    printf("%f\n",pi);

    exit(0);
}

请看输出结果:
在这里插入图片描述
从上图我们可以看到我们不想修改的pi值竟然被修改了,gcc也提出了警告,上面的警告是非常危险的,因为我们不想修改的const变量居然被别人通过间接引用的方式给修改了
那正确的间接引用应该怎么做:要间接引用也需要通过const修饰,如下面演示的代码所示:

    //example 2:如何改变pi的值?
    const float pi = 3.14;
    const float *p = π   //对于一个const类型修饰的,在用指针时,也需要将指针修改位const类型
    *p = 3.14159;
    printf("%f\n",pi);

下面用示例来区分指针常量和常量指针
指针常量

    //指针常量example 1:指针常量,指针指向的地址可以发生变化,指针内容中的值可以发生变化
    int i  = 1;
    int j  = 100;
    int * const p = &i;

 //T  *p = 10;              //p的值可以发生变化
 //F   p = &j;              //指针指向的地址不能发生变化
    printf("%d\n",*p);

常量指针

    int i = 1;
    int j = 100;
    const int *p = &i;          //常量指针:指针指向可以变,但是指针的目标变量不能变

//T:    i = 10;
//F:   *p = 10;                 //此处报错,因为从上可知,*p被修饰成了常量化的目标值,但是对于常量指针的指针指向的目标变量不能变,从而报错


    p = &j;                     //指针的指向是可以发生变化的
    printf("%d\n",*p);

对于两个const修饰的变量

    int i = 1;
    int j = 100;
    const int  *const p = &i;

//F   p = &j;                   //指针指向的地址不能发生变化
//F    *p = 10;                 //指针所指向的目标变量的值也不能发生变i化

    printf("%d\n",*p);

那既然好像const看起来这么麻烦,会用在哪些方面呢?
举例,请看下图
C语言基础--深入理解指针常量和常量指针的前世今生_第1张图片
调用文件时,我们将目标设定为了常量指针,由于常量指针类型可以修改指针指向,但是指针目标空间中的内容是不允许修改的,因此此处文件名字就成了常量,不能被任意修改!

你可能感兴趣的:(C语言基础,指针,c语言,数据结构,linux)