示例說明不同指針表達式的左右值語義
示例:
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++ 解釋下過程:
- ++操作符產生一份cp的拷貝
- 然后++操作符增加cp的值
- 最后在cp的拷貝上進行上執行間接訪問操作。
- 同理*++cp 解釋過程
- ++操作符增加cp的值
- 然后產生一份拷貝
- 最后在這份拷貝上執行間接訪問操作
學習程序
用指針代替數組存字符串的小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指針和數組兩者是可以替換的,用數組的地方可以換成指針。