關于指標的指標,有兩個問題。
一、
// 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看上去像是個陰間寫法,但據我所知,在嵌入式中常用來操作暫存器。
uj5u.com熱心網友回復:
說一下 list-3,(int *)p是強制型別轉換,這個沒問題,*(int **)&p 就不是了,&p 是取p的地址,程式看是個空指標,不考慮,(int **)&p 強制型別轉換,而前面 * 是解參考,得到的是左值,不是右值,這樣就合理了。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/8160.html
標籤:C語言
上一篇:在QT里,在GraphicsView中添加十字控制元件,并顯示十字的坐標等資訊
下一篇:C++請教指標的前中括號啥作用
