指针表达式总结
首先,让我们来看一些声明
char ch='a';//声明字符型变量,并初始化
char *cp=&ch;//声明指针变量,并初始化
下面我们来看一下,普通变量和指针变量在不同表达示中做左值与右值有什么不同:
首先来看个简单的作为开始,如下面这个表达式:
ch
当它作为右值使用时,表式的值为字符'a'。可以当作常量赋给其它变量。
当这个表达式作为左值使用时,这是这个内存的地址而不是刻地址所包含值,它会被当作变量接受其它常量的赋值,其本身的值会被替换。
&ch
当作为右值,表达式的值是变量ch的地址。
当作为左值,是一个不合法的左值。
cp
当作为右值,就是cp的值,即变量ch的地址
当作为左值,就是cp所处的内存位置,可以用动态内存给其置内存单元
&cp
当作为右值,这次所取的是指针变量的地址。这个结果的类型是指向字符的指针的指针。
当作为左值,是一个不合法的左值。不没有清楚定义。
*cp
当作为右值,指向的是ch所在内存中存放的内容,即字符a了。
当作为左值,指向的是ch所在内存地址
*cp+1
当作为右值,表示字符a+1,其结果为字符b.
当作为左值,是一个不合法的左值。不没有清楚定义。
*(cp+1) 表示指向的地址加1,如果是整型变量,将在地址上加四个字节
当作为右值,表示指向的地址加1,重新指向下一个地址所存放的值。 当作为左值,表示指向的地址加1,指向的是下一个地址的本身
++cp cp++
当作为右值,表示指向的地址加1,指向的是下一个地址的本身
当作为左值,是一个不合法的左值。不没有清楚定义。
*++cp *cp++
当作为右值,前者先加加地址,后拷贝指针变量的值,其结果为字符b。后者是先拷贝指针变量的值,在来加加地址。其结果为字符a.
当作为左值,表示指向的地址加1,指向的是下一个地址的本身
++(*cp)(*cp)++
当作为右值,表示字符a+1,其结果为字符b.跟普通变量的自加,自减一样
当作为左值,是一个不合法的左值。不没有清楚定义。
++*++cp 一定要清楚这些操作符的结合性是从右到左,所以是先执行*++cp,可以来成这样++(*++cp)
当作为右值,表示先地址加加,指出指针指向的数在来加加
当作为左值,是一个不合法的左值。不没有清楚定义。