在进入主题之前,我们先来了解一些基本概念,这有助于理解后面列举的指针表达式。
①结合性:就是一串操作符是从左向右执行还是从右向左执行。
'*' :从右向左
'++' :从右向左
②优先级:++(后缀自增) > ++(前缀自增) > *(间接访问) > +(加法)
③左值和右值:左值就是那些可以出现在赋值符号左边的东西,右值就是那些可以出现在赋值符号右边的东西。
举个例子:a = b + 25;
a是个左值,因为它标识了一个可以存储结果值的地点,b + 25是个右值,因为它指定了一个值。
④增值操作符++和减值操作符--
这两个操作符都有两个变型,分别为前缀形式和后缀形式。
抽象的说,前缀和后缀形式的增值操作符都复制一份变量值的拷贝,用于周围表达式的值正是这份拷贝。前缀操作符:先增加变量的值,再对变量进行复制。后缀操作符:先进行复制,再增加变量的值。这些操作符的结果不是被它们所修改的变量,而是被修改的变量的值的拷贝。认识这一点非常重要。
++a = 10;
上面的语句使用是错误的。++a的结果是a值的拷贝,并不是变量本身,你无法向一个值进行赋值。
⑤名词解释:通过一个指针访问它所指向的地址的过程称为“间接访问”或“解引用指针”。用于执行间接访问的操符是单目操作符*。
指针表达式
先有声明
char ch = 'a';
char *cp = &ch;
下面来看3个表达式
1、*++cp
事实上,这个表达式涉及3个步骤:(1)++操作符增加cp的值,(2)++操作符产生增值后的cp的一份拷贝,(3)最后,在cp的拷贝上执行间接访问操作。
所以,它的右值是ch后面那个内存地址的值,而它的左值就是那个位置本身。
2、*cp++
根据前文所述的优先级顺序可知,后缀++操作符的优先级高于*操作符,但表达式的结果看上去像是先执行间接访问操作。其实不是这样的,这个表达式同样涉及3个步骤:(1)++操作符产生cp的一份拷贝,(2)然后++操作符增加cp的值,(3)最后,在cp的拷贝上执行间接访问操作。
3、++*cp
根据前文所述,该表达式中的两个操作符结合性均是从右向左,所以具体步骤为:(1)先执行间接访问操作,(2)然后,cp所指向的位置的值增加1,(3)最后,++操作符产生增值后的值的一份拷贝。所以表达式的结果是这个增值后的值的一份拷贝。
举例不在多而在精,透彻理解这3个表达式,以后就能够举一反三了。
原创作品