本文将要讲到的是关于指针常量和常量指针!
平时我们会经常 见到以下几种类型:
* 1)const int a;
* int const a;
*
* 2)const int *p;
* int const *p; //
*
* 3)int *const p;
*
*
* 4)const 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 <stdio.h>
#include <stdlib.h>
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看起来这么麻烦,会用在哪些方面呢?
举例,请看下图
调用文件时,我们将目标设定为了常量指针,由于常量指针类型可以修改指针指向,但是指针目标空间中的内容是不允许修改的,因此此处文件名字就成了常量,不能被任意修改!