C++原始指针的基本运算操作
&运算符和*运算符
先导知识:左值和右值
char ch = 'a';
char* cp = &ch;
表达式 &ch
- 作为右值时:表示获取到ch的地址,相当于用了一个指针副本来存这个地址值

- 作为左值时:
非法
表达式 &cp
- 作为右值时:表示获取到cp的地址,相当于用了一个指针副本来存这个地址值

- 作为左值时:
非法
表达式 *cp
- 作为右值时:表示获取指针cp所指向内存空间中存放的数据的值,此时该右值可以赋值给其他指针
e.g.char* cp2 = *cp;

- 作为左值时:表示获取指针cp所指向的内存空间,此时该左值可以被赋值
e.g.*cp = 'b'; // 将cp所指向内存空间中的数据从a修改为b
指针所指向区域能否被修改,由这一块区域的性质来决定。
表达式 *cp + 1
- 作为右值时:根据运算优先级,先*后+,因此表示,先获取指针cp所指向内存空间的数据的值,再对该数值进行+1操作

- 作为左值时:
非法。该表达式作为左值的字面意义是获取cp所指内存空间(一个地址),再对该地址+1(得到下一个地址空间),但是这一地址空间不一定是程序能够访问的合法空间,也没有一个确定的值。
表达式 *(cp + 1)
- 作为右值时:先获取cp所指向的内存空间,再+1,得到接下来一个内存空间,再进行*运算,获取这一内存空间中的数值。同样地,该右值可以赋值给其他指针
e.g.char* cp3 = *(cp + 1);

- 作为左值时:先获取cp所指向的内存空间,再+1,得到接下来一个内存空间,同样地,该左值可以被赋值
e.g.*(cp + 1) = 'b'; // 将这一内存空间的数值修改为b

++与--操作符
char* cp2 = ++cp;
这行代码对应的汇编代码为:
mov eax,dword ptr[cp]
add eax,1
mov dword ptr[cp],eax
mov ecx,dword ptr[cp]
mov dword ptr[cp2],ecx
char* cp3 = cp++;
这行代码对应的汇编代码为:
mov eax,dword ptr[cp]
mov dword ptr[cp3],eax
mov ecx,dword ptr[cp]
add ecx,1
mov dword ptr[cp],ecx
从汇编的层级来理解前置++与后置++的顺序:++cp会先修改cp(对应第一段汇编代码的第1-3行),再使用修改后的cp赋值给cp2(对应第一段汇编代码的第4-5行);cp++会先使用cp赋值给cp3(对应第二段汇编代码的第1-2行),再去修改cp(对应第二段汇编代码的第3-5行),此时修改后的cp已不会影响cp3。
理解了这些知识后,再来进一步看看前置++和后置++作为左右值的区别。
表达式 ++cp
- 作为右值时:表示的是cp所指向内存空间的下一个内存空间

- 作为左值时:
非法
表达式cp++
- 作为右值时:表示的是cp所指向的内存空间

- 作为左值时:非法
表达式 *++cp
- 作为右值时:表示的是获取cp所指向内存空间的下一个内存空间的值

- 作为左值时:表示的是获取cp所指向内存空间的下一个内存空间

表达式 *cp++
- 作为右值时:表示的是获取cp所指向内存空间的值

- 作为左值时:表示的是获取cp所指向的内存空间


C++指针的基本运算简介

浙公网安备 33010602011771号