# C的指針 分析

示例說明不同指針表達式的左右值語義


示例:

char ch='a';
char *cp=&ch;

cp:一個保存ch地址的值.

*cp:指的是cp指向的地址的值。

參照上面的示例,描述一下不同表達式,左值和右值得意義:

表達式 右值 左值
&ch ch的地址 非法
cp cp的值 cp所處的內存位置
&cp 指針變量cp的地址 非法
*cp cp所指向的地址的值 cp所指向的內存位置
*cp +1 cp所指向的地址的值 +1 非法
*(cp +1) cp所指向的位置前進一個 非法
cp++ 先返回cp的一份拷貝,cp的值再加1 非法
++cp cp的值加1后返回cp的拷貝 非法
*++cp cp所指向位置的后面一個值 cp所指向位置的后面一個位置
*cp++ cp所指向位置的值 cp所指向的位置
++*cp 對cp所指向位置的值加1 非法
(*cp)++ 拷貝cp所指向位置的值,并加1 非法
++*++cp 拷貝cp所指向位置后面一個位置的值加1 非法
++*cp++ 指向cp所指向的位置然后加1,產生一份拷貝 非法

注意: 書上說是++比*的優先級要高.但是不要用這個規則來分析上述表達式的語義。

我簡單總結:

  • 當*和++都在左邊的時候,按照從右向左分析語義
  • 如果* ++分布在變量的兩邊的時候,先后綴++,然后'*' .
  • +操作符比*優先級低
  • *cp++ 解釋下過程:
  1. ++操作符產生一份cp的拷貝
  2. 然后++操作符增加cp的值
  3. 最后在cp的拷貝上進行上執行間接訪問操作。
  • 同理*++cp 解釋過程
  1. ++操作符增加cp的值
  2. 然后產生一份拷貝
  3. 最后在這份拷貝上執行間接訪問操作

學習程序


用指針代替數組存字符串的小demo.

因為C中空間都要事先分配,我表示我也很尷尬.

char *str=(char *)malloc(10);
printf("%d\n",str);
*str='a';
printf("%d———%c\n",str,*str);
*++str='b';
printf("%d———%c\n\n",str,*str);
  • *str默認指向的是所分配內存的第一個位置

總結


  • C指針和數組兩者是可以替換的,用數組的地方可以換成指針。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容