前言
碰到个问题,就是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所指向的地址的内容
define
、typedef
和const
简单来说,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
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 |
|
为什么出现相反结果呢,根据上面的给出的定理,我们很容易推出原因:第二段代码出现这样的结果是因为const直接修饰指针p
typedef int* pint;
const pint p;//内部实现相当于 int* const p;
#define pint int*
const pint p;//简单文本替换,相当于 const int* p;
这就是define和typedef的区别吧,