指针 二

来源:互联网 发布:php 工厂模式 实例 编辑:程序博客网 时间:2024/04/30 22:13

6.7指针表达式:在理解下面内容时,切记,左值意味着一个位置,右值意味着一个值。

char              ch = ‘a’;

char              *cp = &ch;

现在,初始化上面的两个变量如下:

途中还显示了ch后面的那个内存位置,因为我们所求的表达式将访问它。因为不知道它的初始值,所以用?代替。

如下开始逐个介绍指针表达式:

1.

ch作为右值时,表达式的值为’a’,那个粗线提示表达式的值,当ch作为左值时,它是这个内存的地址而不是该地址所存储的值,粗线提示这个位置就是表达式的结果。为什么粗线方框没有值呢?事实上,这个值将被某个新值取代。

结果如下:

2.

&ch作为右值,这个表达式的值是变量ch的地址,这个值同变量cp中存储的值一样,为什么表达式不是合法的左值优先级表格显示&操作符的结果是个右值。答案很简单,当表达式&ch求值时,它的结果存储于计算机什么地方呢?你无法知道它位于何处。所以不是合法的左值。

结果如下:

3.

cp作为右值时,表达式的结果是cp的值,当cp作为左值时,表达式的结果是cp所处的内存位置。

结果如下:

4.

这个例子与&ch类似,这次我们取得是指针变量的地址,这个结果的类型是指向字符的指针的指针。同样,这个值得存储位置并未清晰定义,所以这个表达式不是一个合法的左值。

5.

*cp作为右值时,表达式的结果是ch中存储的值a,当*cp作为左值时,cp指向ch这块内存地址,为什么粗线方框没有值呢?事实上,这个值将被某个新值取代。如果*cp的值改变,那么,ch中存储的值也随之改变。

6.

*cp+1作为右值时,表达式的结果就是在cp中存储的值(a)加上1等于b,当*cp+1作为左值时,是非法的,因为*cp+1是一个值,而不是位置。

 

7.

在这里我们需学习很重要的一点。【注意:指针加法运算的结果是个右值,因为它的存储位置并未清晰的定义】。如果没有间接访问操作符,这个表达式不是一个合法的左值。当加上间接操作符也不一定是合法的左值,1.cp指向字符数组,且不是字符数组的末尾时,表达式是一个合法的左值。2.cp指向单个字符时,表达式不是合法的左值。因为ch后面的那个内存位置我们不知道原先存储的是什么东西,一般而言,我们是无法得知的,所以像这种表达式是非法的。

8.

对于上面两个表格的理解举如下例子:

int                i = 1;

++i;             //i的值是2++i的值是2

i++           // i的值是2i++的值是 1

其实,指针也类似,只是cp+n  (n=1,2….)的结果是cp+n*类型所占的字节数。

例如:

int i=1;

int *cp = &i  //假如&i=0012FF60

cp+1等于cp+1*int占的字节数(4=0012FF60+1*4=0012FF64.

10.

这里。间接访问操作符作用域增值后的指针的拷贝上,所以它的右值时ch后面那个内存地址的值,而它的左值就是那个位置本身。其实,它和*cp类似。

12.

因为++的优先级比*的高,所以先计算cp++,再算*cp++)。使用后缀++操作符所产生的结果不同,它的左值和右值分别是ch的内存位置和变量ch的值。

【注意】:这个表达式通常应用在循环中,首先用一个数组的地址初始化指针,然后使用这种表达式就依次访问该数组的内容了。

13.

在这个表达式中,由于这两个操作符的结合性都是从右向左,所以首先执行的是间接访问操作,然后,cp所指向的位置的值增加1,表达式的结果是这个增值后的值的一份拷贝。

14.

与前一个类似,只是表达式的结果是增值前的值a

15.

这个表达式看起来相当的复杂,记住这些操作符的结合性都是从右到左,所以首先执行的是++cp,就是虚线椭圆表示的第一个中间结果,接着,我们对这个拷贝值进行间接访问,它使我们访问ch后面的那个内存位置,就是虚线方框表示的第二个中间结果,最后,执行++操作,也就是增加它的值,我们之所以用(?+1)代替,是因为我们不知道该位置原先的值。

16.

这个表达式和前一个表达式的区别在于这次第1++操作费是后缀形式而不是前缀形式,由于它的优先级高,所以先执行它,间接访问操作所访问的是cp所指向的位置而不是cp所指向位置后面的那个位置。

 

        对以上部分程序,因为它的左值是非法的,而我在程序中加了它作为左值的代码,没有注释掉,为了看到编译器提示的错误,到了后半部分程序我把那部分错误代码注释掉了,如果还有其他错误请留言。

原创粉丝点击