C语言 const与指针

前言

碰到个问题,就是define pint int*typedef int* pint与const 一起使用时有什么区别呢

const与指针

const用法大家都知道,当const修饰一个变量时,该变量的值在初始化后是不能被更新的。
那么,当const修饰的变量是一个指针变量时,会发生什么呢?
这里,我先给大家一个结论或者说是定理:

在忽略变量类型修饰符(如int,double之类)之后,被const直接修饰的变量最终指向的内容不可变

const int p;// 忽略int,const修饰p,p初始化后不可更改
const int* p;//忽略int,const修饰*p,不能通过*p更改p所指向的地址里的内容,但,可以更改p的指向(即可以p在初始化后可以指向其他int型的变量的地址)
int const *p;//同上
int* const p;//const修饰p,p初始化后指向地址不可更改,但可以通过*p更改p所指向的地址的内容

definetypedefconst

简单来说,define只是文本替换,typedef是类似封装的含义。

#define pint int*
pint a,b; // a是int*型,b是int型

typedef int* pint;
pint a,b;// a,b都是int* 型

所以开始我们遇到的问题就很好解释,下面来看两段代码:

1
2
3
4
5
6
7
8
9
#include<stdio.h>
#define pint int*
int main(){
int a=3,b=4;
const pint p=&a;//简单文本替换,相当与 const int* p=&a, const直接修饰*p
p=&b;//正确,p可以更改
*p=5;//错误,*p不可更改
return 0;
}

1
2
3
4
5
6
7
8
9
10
#include<stdio.h>

int main(){
int a=3,b=4;
typedef int* pint;
const pint p=&a;
p=&b;//错误,p不可以更改
*p=5;//正确,*p可以更改
return 0;
}

为什么出现相反结果呢,根据上面的给出的定理,我们很容易推出原因:第二段代码出现这样的结果是因为const直接修饰指针p

typedef int* pint;
const pint p;//内部实现相当于 int* const p;

#define pint int*
const pint p;//简单文本替换,相当于 const int* p;

这就是define和typedef的区别吧,