« 上一篇下一篇 »

<C和指针>学习笔记(1)--指针表达式

在进入主题之前,我们先来了解一些基本概念,这有助于理解后面列举的指针表达式。

①结合性:就是一串操作符是从左向右执行还是从右向左执行。

'*' :从右向左

'++' :从右向左

②优先级:++(后缀自增) > ++(前缀自增) > *(间接访问) > +(加法)

③左值和右值:左值就是那些可以出现在赋值符号左边的东西,右值就是那些可以出现在赋值符号右边的东西。

举个例子: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个表达式,以后就能够举一反三了。


原创作品