示例說(shuō)明不同指針表達(dá)式的左右值語(yǔ)義
示例:
char ch='a';
char *cp=&ch;
cp:一個(gè)保存ch地址的值.
*cp:指的是cp指向的地址的值。
參照上面的示例,描述一下不同表達(dá)式,左值和右值得意義:
| 表達(dá)式 | 右值 | 左值 |
|---|---|---|
| &ch | ch的地址 | 非法 |
| cp | cp的值 | cp所處的內(nèi)存位置 |
| &cp | 指針變量cp的地址 | 非法 |
| *cp | cp所指向的地址的值 | cp所指向的內(nèi)存位置 |
| *cp +1 | cp所指向的地址的值 +1 | 非法 |
| *(cp +1) | cp所指向的位置前進(jìn)一個(gè) | 非法 |
| cp++ | 先返回cp的一份拷貝,cp的值再加1 | 非法 |
| ++cp | cp的值加1后返回cp的拷貝 | 非法 |
| *++cp | cp所指向位置的后面一個(gè)值 | cp所指向位置的后面一個(gè)位置 |
| *cp++ | cp所指向位置的值 | cp所指向的位置 |
| ++*cp | 對(duì)cp所指向位置的值加1 | 非法 |
| (*cp)++ | 拷貝cp所指向位置的值,并加1 | 非法 |
| ++*++cp | 拷貝cp所指向位置后面一個(gè)位置的值加1 | 非法 |
| ++*cp++ | 指向cp所指向的位置然后加1,產(chǎn)生一份拷貝 | 非法 |
注意: 書(shū)上說(shuō)是++比*的優(yōu)先級(jí)要高.但是不要用這個(gè)規(guī)則來(lái)分析上述表達(dá)式的語(yǔ)義。
我簡(jiǎn)單總結(jié):
- 當(dāng)*和++都在左邊的時(shí)候,按照從右向左分析語(yǔ)義
- 如果* ++分布在變量的兩邊的時(shí)候,先后綴++,然后'*' .
- +操作符比*優(yōu)先級(jí)低
- *cp++ 解釋下過(guò)程:
- ++操作符產(chǎn)生一份cp的拷貝
- 然后++操作符增加cp的值
- 最后在cp的拷貝上進(jìn)行上執(zhí)行間接訪問(wèn)操作。
- 同理*++cp 解釋過(guò)程
- ++操作符增加cp的值
- 然后產(chǎn)生一份拷貝
- 最后在這份拷貝上執(zhí)行間接訪問(wèn)操作
學(xué)習(xí)程序
用指針代替數(shù)組存字符串的小demo.
因?yàn)镃中空間都要事先分配,我表示我也很尷尬.
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默認(rèn)指向的是所分配內(nèi)存的第一個(gè)位置
總結(jié)
- C指針和數(shù)組兩者是可以替換的,用數(shù)組的地方可以換成指針。