C語言關於指針移動的學習筆記


作為C語言初學者,最早是在單片機開發時遇到這個 *p++ 的,確實有點搞不清楚。首先是查詢運算符優先級

不巧的是p兩邊的運算符是同一優先級的,而且寫的是從右向左結合,從右向左的字面意思當然是先++(指針指向下一單元地址),再取值(解引用)了

 遇到想不明白的,一般測試一下就清楚多了,所以寫了下面幾句,結果如下:

 

 

聲明指向字符串常量的指針開始就指向a,如果按上面的理解,指針先移動,那么第一個打印出來的應該是b,既然a被打印出來就說明實際是先運算了“*”

 下一步試着強制先移動指針,於是把p++用括號括起來,再運行

 

 

果然還是這個鳥樣子,說明上面提到的“從右向左結合”沒有騙我,原來不加這個括號也是一樣的

這里其實沒必要糾結字面意思應該怎么理解。反正我們要實現的無非就是兩種操作,要么先取值再移動指針,要么先移動指針再取值。前者已經實現,后者的話,從優先級列表里就能看出來,用++p就可以了。試一下果然沒錯

 

 

不過我還是比較好奇,回到最開始的問題,既然p和++括起來沒什么影響,那么*和p括起來呢?雖然有點討厭不過還是試一下:

 

 

程序編譯沒問題,但是運行時出錯了。不加括號時,*p++相當於*p; p++,而(*p)++相當於先取值得到a,然后把a這個常量加1,而常量占用的內存應該是不允許被修改的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM