首先,常量指针
:指向‘常量’的指针(翻译)
意思是不能通过该指针引用来修改指向的 某变量或常量 的值。(旨在保护变量)
const int *PtrConst; == int const *PtrConst;
(从该定义方式,也可以看出其名字是 常量 -> 指针)
如:
int a = 1;
int b = 1;
const int*ptr = &a;
*ptr = 2; // 错误
ptr = &b; //无错误
指针常量
:指针类型的常量(翻译)
int* const ptr == const (int*) ptr (这里十分重要,参见文末的define与typedef)
意思是不能改变指向的指针,也就是说在声明时必须对其进行初始化。(旨在固定指针指向)
然后这家伙又分为两类:
- 指向非常量的:
int a = 1;
int b = 1;
const c = 1;
int* const ptr = &c //错误,不能指向常量(就像普通的指针不能用常量来赋值 int *ptr3=&c //错误)
int* const ptr1 = &a;//正确
*ptr1 = 2 ; //正确,可以修改值
ptr1 = b; // 错误,不能改变指向
- 指向常量的:
const int a = 1;
int b = 1;
const int* const ptr = &b; //正确 !!!
const int* const ptr1 = &a; //正确 !!! 不能更改指向,也不能修改值
typedef与#define
- 原理与作用域
#define是编译预处理指令,在编译前进行简单的字符替换,没有作用域的限制
typedef是关键字,构成语句要加;结尾。是定义新的类型,作用域取决于所在的文件位置 - 区别
比如当这两者撞车指针的时候
PS:由此可见,*只是修饰类型(如int), 或者修饰指针名。所以在书写的时候不要将*写到const上,我就是被其他人这样的写法困惑了很久。。。
参考文章:
指针常量和常量指针的区别 - 虽千万人吾往矣-GKH - 博客园