天天看點

關于結構體二級指針引用時必須加括号的問題 (*L)->next,而不是*L->next

今天一天的時候都耗在了單連結清單的操作函數的編寫上了,其實本來應該是一件很簡單的事情,但是由于一個優先級的錯誤,導緻了我調試了很久

先說下結論,結構體的二級指針在調用時,必須加上括号,因為*(取值)運算優先級是比->來的低的。

再來說下發現過程,寫了很久的程式,産生了各種編譯錯誤,排除好多粗心和手誤的錯誤外,還有一個錯誤讓我百思不得解,代碼及錯誤提示為:

錯誤代碼: *L->Node = NULL;
           
錯誤提示: [Error] request for member 'next' in something not a structure or union
           

當然這隻是n多同類型錯誤中的一個,一開始我以為是函數調用的問題,就先将所有函數體都注釋掉了,然後将一些涉及到這些錯誤的語句單獨複制到主函數裡,結果錯誤依舊存在。

後來各種查閱資料,無果,當然這裡可能是我搜尋的關鍵字不太對,因為我當時的目光一直盯在二級指針的内容上,我一開始始終認為是我的二級指針可能和某個一級指針弄混了,但現在想想,編譯器并沒有報這類的錯誤。

然後吃過晚飯,我嘗試着将所有的二級指針單獨拿出來,就是先定義一個一級指針,再把二級指針的内容賦給一級指針,再去操作一級指針,就像下面這樣:

struct Node *n;
	n = *L; //L為二級指針
	n->data = 0;
           

奇迹出現了,我這樣寫了之後,錯誤提示竟然消失了,這時我才意識到,可能是我在二級指針的調用上出了問題,于是去百度了“結構體二級指針的調用”,在CSDN的論壇的一個文章裡看到了這樣的一行代碼:

(*ppA)->name = "ddddddd"
           

我恍然大悟,去查了一下C語言運算符的優先級清單,發現 * 的優先級果然沒有 -> 高,頓覺自己像個白癡。。。。。。

經過這件事,我學到了以下幾點:

1. * 的優先級沒有 -> 高。

關于結構體二級指針引用時必須加括号的問題 (*L)->next,而不是*L->next

2.對于不知道優先級的運算,要加上括号才保險。

3.要多閱讀他人的代碼。

最後,附上C語言運算符優先級表:

優先級 運算符 名稱或含義 使用形式 結合方向 說明
1 後置++ 後置自增運算符 變量名++ 左到右
後置-- 後置自減運算符 變量名--
[ ] 數組下标 數組名[整型表達式]
( ) 圓括号 (表達式)/函數名(形參表)
. 成員選擇(對象) 對象.成員名
-> 成員選擇(指針) 對象指針->成員名
2 - 負号運算符 -表達式 右到左 單目運算符
(類型) 強制類型轉換 (資料類型)表達式
前置++ 前置自增運算符 ++變量名 單目運算符
前置-- 前置自減運算符 --變量名 單目運算符
* 取值運算符 *指針表達式 單目運算符
& 取位址運算符 &左值表達式 單目運算符
! 邏輯非運算符 !表達式 單目運算符
~ 按位取反運算符 ~表達式 單目運算符
sizeof 長度運算符 sizeof 表達式/sizeof(類型)
3 / 表達式/表達式 左到右 雙目運算符
* 表達式*表達式 雙目運算符
% 餘數(取模) 整型表達式%整型表達式 雙目運算符
4 + 表達式+表達式 左到右 雙目運算符
- 表達式-表達式 雙目運算符
5 << 左移 表達式<<表達式 左到右 雙目運算符
>> 右移 表達式>>表達式 雙目運算符
6 > 大于 表達式>表達式 左到右 雙目運算符
>= 大于等于 表達式>=表達式 雙目運算符
< 小于 表達式<表達式 雙目運算符
<= 小于等于 表達式<=表達式 雙目運算符
7 == 等于 表達式==表達式 左到右 雙目運算符
!= 不等于 表達式!= 表達式 雙目運算符
8 & 按位與 整型表達式&整型表達式 左到右 雙目運算符
9 ^ 按位異或 整型表達式^整型表達式 左到右 雙目運算符
10 | 按位或 整型表達式|整型表達式 左到右 雙目運算符
11 && 邏輯與 表達式&&表達式 左到右 雙目運算符
12 || 邏輯或 表達式||表達式 左到右 雙目運算符
13 ?: 條件運算符 表達式1? 表達式2: 表達式3 右到左 三目運算符
14 = 指派運算符 變量=表達式 右到左
/= 除後指派 變量/=表達式
*= 乘後指派 變量*=表達式
%= 取模後指派 變量%=表達式
+= 加後指派 變量+=表達式
-= 減後指派 變量-=表達式
<<= 左移後指派 變量<<=表達式
>>= 右移後指派 變量>>=表達式
&= 按位與後指派 變量&=表達式
^= 按位異或後指派 變量^=表達式
|= 按位或後指派 變量|=表達式
15 , 逗号運算符 表達式,表達式,… 左到右 從左向右順序運算

繼續閱讀