淮北建网站,自助建站源码下载,信用湘潭网站,wordpress mega menu在理解指针表达式之前先有一个概念就是“左值”和“右值”#xff0c;对于左值就是可以出现在赋值符号左边的东西#xff0c;右值就是那些可以出现在赋值符号右边的东西。进一步抽象可以这样理解#xff1a;左值应该可以作为一个地址空间用来存放一个值#xff0c;而右值可…在理解指针表达式之前先有一个概念就是“左值”和“右值”对于左值就是可以出现在赋值符号左边的东西右值就是那些可以出现在赋值符号右边的东西。进一步抽象可以这样理解左值应该可以作为一个地址空间用来存放一个值而右值可以作为一个值来处理当然需要说明的是有些是既可以作为左值也可以作为右值的例如定义a为一个指针指向b那么*a既可以作为一个右值即地址b中存放的数据也可以作为一个左值即表示b的地址。其实说到这里就已经说明了一个简单的指针表达式了那就是*a。下边就再讨论一些其他的指针表达式。
首先做一个声明
char ch “a”;
char *cp ch;
其实这个声明很明了这个声明声明了两个变量ch和cpcp作为一个指针指向ch。为了便于随后的说明我现在做如下设想cp变量地址为0x12ch变量的地址为0x23即现在空间cp中的内容为0x23ch中的内容为a字符。下边做一些表达式的分析
1、ch右值表示ch的地址信息即0x23这个值。左值它作为左值是非法的因为它已经不可以作为一个空间来使用。
2、cp右值表示cp中的内容即ch的地址信息0x23。左值表示cp这个地址空间作为一个空间使用。
3、cp右值表示cp的地址信息即0x12这个数据。左值类比ch也可知它作为左值是非法的。
4、*cp这个和我们博文开始的例子是一样的。右值表示ch内的内容a字符。左值表示ch这个地址空间。
5、*cp 1要注意*我个人理解为间接范围操作符的优先级高于。右值运算过程为首先做间接的访问操作得到a字符的一个拷贝再加1得到字符b。左值位置未清晰定义是非法的。
6、*cp 1这个表达式可以把cp1看做一个整体它作为指针加法运算的结果是一个右值表示ch的下一个地址*cp1做右值表示对ch下一个地址中的数据内容做左值表示ch下一个地址这个空间注意cp1本身不是左值。
7、cp与cp该表达式涉及运算符两个表达式除了都有cp1的功能外两个表达式整体的结果也都会得到变量的拷贝但是前缀会先执行加1的操作再获得变量拷贝而后缀则是先进行变量的拷贝再执行加1操作。因此cp表达式作为右值执行后cp和cp都会指向cp后面的内存位置而cp作为右值执行后cp会指向cp内存后面的内存位置而cp整体则是指向cp原来的内存位置0x12。他们都没有清晰的位置定义所以都是不合法的左值。
8、*cp与*cp对比上边两个表达式这两个理解起来也很容易了只是进行了一次指针运算即间接访问操作对于右值来看这两个表达式结果只是对上边两个操作结果的间接访问即对应空间内的数据对于左值来看这回就是合法的了对应的就是响应地址的地址信息了。
综合其实关于指针的表达式还有很多不同运算符之间的相应组合都会形成相应操作符只要根据相应的运算符的优先级一步步运算都可以得到其相应结果。叙述了这么多的表达式但是在实际运用中大多数还是一般的表达式之所以把他们都整理一下是因为1、有助于我们去理解别人的代码因为别人很可能会写出这些表达式。2、有个别时候是用得到的学习也是有必要的。3、总结这么多最终目的并不是要简单的去理解现有的表达式而是通过现有的表达式的整理和理解充分理解指针以及指针表达式的真正含义深入的理解指针这个东西有助于后期的学习和提高。