好不容易偷闲,去逛了下论坛,这手贱的又点到了技术区,看了个哥们的问题,就是const和typedef结合在一起会出现什么情况,那百度和360结合会是什么况。。。。
描述下问题:
typedef int* p2i;
int a = 2;
int b = 3;
int c = 4;
const int *pa = &a;
//不能用pa修改a的值,*pa = value
const p2i pb = &b;
//pb不能指向其他地址,pb = value
p2i const pc = &c;
//pc不能指向其他地址,同上。
这里涉及了两点:(1)const的先左还是先右结合 (2)typedef的效果 (3)变量的类型
(1)const 向左走向右走:const的意义就是只读,读书,“只读经典型”,就是const先向右走,如果右侧有类型符,如int,float、、之流,就跟类型符结合。若没有,则向左走,跟左侧的*符结合。
(2)typedef与#define有区别,其中之一就是typedef封装性,或者叫原子性,即通过typedef将目标封装成整体,并起了个新的名字(典型贴牌山寨机)。但效用等价。
对于const int *pa = &a;
(3)变量的类型:就是这是个什么变量,找到变量,查看其右,若为(),则表示函数,若为 [ ] 则为数组,查看其左,左侧为 * ,则表示指向 XXoo 的指针。
则const int *pa = &a,const与类型为int 的类型结合,pa与 *结合,综合起来:pa是个指针,一个指向只读整形的指针。即pa指向的内容不能变。但pa的指向可以变。
const p2i pb = &b:pb右侧无(),[ ],即pb非数组,也不是函数,左侧没见到指针符号 *(被封装了),故pb仅仅是个变量,类型为只读p2i型的变量,将p2i的意义加进去,pb就是个只读指针变量,即指针的指向不能改变,指向的地址里的内容可以改变。
对于p2i const pc =&c,理解了typedef的封装性,其实雷同于 int const x 和const int x ,所以,这种情况的意义同上。