C++中将递增和递减运算符用于指针
指针包含内存地址。例如,程序中的 int 指针包含 0x002EFB34——int 在内存中的地址。 int 本身长 4 字节,因此占用 0x002EFB34~0x002EFB37 的内存。将递增运算符用于该指针后,它指向的并不是 0x002EFB35,因为指向 int 中间毫无意义。
如果您对指针执行递增或递减运算,编译器将认为您要指向内存块中相邻的值(并假定这个值的类型与前一个值相同),而不是相邻的字节(除非值的长度刚好是 1 字节,如 char)。
int age = 30;
int* pointsToInt = &age;
因此, 对于上面的程序中的指针 pointsToInt, 对其执行递增运算将导致它增加4字节, 即sizeof(int)。将++用于该指针相当于告诉编译器,您希望它指向下一个 int,因此递增后该指针将指向 0x002EFB38。同样,将该指针加 2 将导致它向前移动两个 int,即 8 字节。在本文后面,您将看到指针和数组索引之间的关系。
使用运算符–将指针递减的效果类似:将指针包含的地址值减去它指向的数据类型的 sizeof。
将指针递增或递减的结果将指针递增或递减时,其包含的地址将增加或减少指向的数据类型的 sizeof(并不一定是 1 字节)。这样,编译器将确保指针不会指向数据的中间或末尾,而只会指向数据的开头。如果声明了如下指针:Type* pType = Address;则执行++pType 后, pType 将包含(指向) Address + sizeof(Type)。
以下示例程序演示了对指针递增和添加偏移量的结果:
#include <iostream>
using namespace std;int main()
{cout << "How many integers you wish to enter? ";int numEntries = 0;cin >> numEntries;int* pointsToInts = new int [numEntries];cout << "Allocated for " << numEntries << " integers" << endl;for(int counter = 0; counter < numEntries; ++counter){cout << "Enter number "<< counter << ": ";cin >> *(pointsToInts + counter); }cout << "Displaying all numbers entered: " << endl;for(int counter = 0; counter < numEntries; ++counter)cout << *(pointsToInts++) << " ";cout << endl;// return pointer to initial positionpointsToInts -= numEntries;// done with using memory? release delete[] pointsToInts;return 0;
}
输出:
How many integers you wish to enter? 2
Allocated for 2 integers
Enter number 0: 8774
Enter number 1: -5
Displaying all numbers entered:
8774 -5
再次运行的输出:
How many integers you wish to enter? 5
How many integers you wish to enter? 5
Allocated for 5 integers
Enter number 0: 543
Enter number 1: 756
Enter number 2: 2017
Enter number 3: -101
Enter number 4: 101010012
Displaying all numbers entered:
543 756 2017 -101 101010012
分析:
这个程序询问用户想输入多少个整数,再在第 9 行相应地分配内存。这个程序演示了两种递增指针的方法:一是使用偏移量,如第 15 行所示,它使用偏移量变量 counter 将用户输入直接存储到内存单元中;二是使用运算符++,如第 20 行所示,它将指针包含的地址递增,让指针指向下一个元素。
第 12~16 行的 for 循环让用户输入数字,然后使用第 15 行的表达式将其存储到相邻的位置。这个表达式给指针增加从零开始的偏移量( counter)。第 19 和 20 行的 for 循环与此类似,它显示前一个循环存储的值。
调用 delete[]来释放内存时,必须指定分配内存时 new 返回的指针地址。这个值最初存储在 pointsToInts 中,但第 20 行的运算符 ++ 修改了 pointsToInts,因此第 25 行使用运算符 -= 让 pointsToInts 重新指向原来的地址,再在第 28 行对这个地址调用 delete[]。
该文章会更新,欢迎大家批评指正。
推荐一个零声学院的C++服务器开发课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容
点击立即学习:C/C++后台高级服务器课程