一、
// list-1
{
int a = 10;
const int *pa;
pa = &a; // OK
printf("%d\n", *pa);
}
已知,const pointer是可以指向non-const pointer的。
同理,我会认为const pointer pointer也可以指向non-const pointer pointer。
然而,实际必须类型转换后才可以,如list-2
// list-2
{
int a = 10;
int *pa = &a;
const int **ppa = (const int **)&pa; // here
printf("%d\n", **ppa);
}
因此,double pointer必须类型一致是吗?
二、
有这样一段代码
// list-3
{
char *p;
int i = 10;
*(int **)&p = &i;
printf("%d\n", *p);
}
第5行是一种偷鸡取巧的方法,可以让左边的表达式既可以是左值又可以类型转换。
直接(int *)p = &i是不行的,因为类型转换产生的是临时变量,即右值,不可以赋值。
但*(int **)&p不也是类型转换了吗,为什么却可以赋值,偷鸡取巧在哪里?
P.S. 写着写着,似乎有了思路。
类型转换后虽然是右值,但临时空间里存的是毕竟是指针,
而且解第一层指针后再赋值,并非直接对右值赋值,
最终依旧是给p赋值,但类型是int *。
请问,这个思路有没有问题?
P.S. list-3看上去像是个阴间写法,但据我所知,在嵌入式中常用来操作寄存器。