最近总结了指针的一些表达方式,及其了解了C语言中左值及其右值的定义。
左值、右值定义
左值:左值就是能够出现在赋值符号左边的东西,右值就是能够出现在赋值等号右边的东西。指针表达式
首先要了解两个符号的意思
&:取地址运算号
*:取指针指向的内存中的值
假如定义:
char ch = ‘a’;
char *p = &ch;
1. 表达式一
&ch
意义:表示变量ch的地址。
这个地址值被存在了指针变量p中,而且ch只能够作为右值赋给指针变量来操作,不能够作为左值,因为该表达式的意义是一个地址值,在程序没有编译之前,是不能提前知道它的位置的。所以不是一个合法的左值。
2. 表达式二
p
意义:左值就是p所在的地址,不是该地址包含的值,右值就是它本身的值。
3. 表达式三
&p
意义:取了指针变量p的地址
左值是非法的,同表达式一的解释一致,右值是一个地址值。
4. 表达式四
*p
意义:作为左值的时候是一个内存的地址,而不是该内存地址中的值,作为右值的时候是指向的内存中的值
对一些表达式的深入理解
- 理解指针中两个操作符号的优先级
“ * ”的优先级是大于”&”的 - 指针的运算,指针的加法运算一般为右值,但是前提要进行合法的间接的访问操作
指针的+ - 运算移动的是指针的位置
*p + 1
对于这个式子的理解,首先要看它的操作符的优先级,*的优先级要大于+。所以该表达式是先对指针P进行间接的访问操作,来获得它指向的ch 中的值a,然后取得这个a 的值,然后在进行+1操作,所以最后的结果是b.
*(p + 1)
首先看优先级,括号中的p指针向后移动了一个位置,指向了ch之后的一个内存位置,但是在此处的定义中,不知道ch下面的位置是具体的哪一个,所以在此处左值和右值都是不合法的。
p++与++p
首先p++是先返回p值的一份拷贝,最后在增加p的值,所以这个表达式还是和原来的p++是一样的,就是原来拷贝的p值。
然而++p又是相反的,它是增值后指针的拷贝,指向的是一个ch后的不知道的位置.
*++p与*p++
与+的优先级一样,结合方向是自右向左,所以++p等价于*(++P),就是先将p增值后再进行间接访问,是访问的ch 变量后面的值,是作为右值,而左值就是指针往后移动之后的位置本身。就是使p指向ch后面的一个变量,最后再取ch之后的那个位置的值。
p++等价于(p++)首先是获得cp的一份拷贝,即首先执行获得p当前的所指向变量的值,最后再将p指向后面的一个位置,但是它的右值仍然是变量ch的值,左值是变量ch的内存位置
++*p 与(*p)++
首先取得p所指向的ch的值,最后才进行自加,所以该表达式的右值是正确的,作为左值是非法的。
++*++p
首先是将p增加,再用*来简接访问,最后访问的结果再自加。
++*p++
首先是拷贝p的值,再把p指向的位置往后移动,然后简接访问cp所指向的位置,是ch的位置,不是移动后的位置,最后访问到ch 的值后再进行自加。
感觉指针真的很难正确的用好,先从表达式开始吧