09 指针的运算
指针是一个存储内存空间地址的一个数据。我们可以创建一个指针然后打印一下:(环境:Windows11 (arm/Apple M VM)/Visual Studio 2022/Debug/arm64)
int a;
int* p = &a;
cout << (int)p << endl;
-1581319276
在这里,我们可以很明显看出这个p
的指针是一个int
类型的。int
类型占用 4 个字节的大小。
-
指针的加法:
我们接着上面的例子,修改一下代码:
int a; int* p = &a; cout << (int)p << endl; p++; cout << (int)p << endl; p = p + 1; cout << (int)p << endl;
-321913948 -321913944 -321913940
发现三次输出
p
所记录的内存空间,都是相差 4 个字节,这是因为int
类型占用 4 个字节的空间。让指针+x
(这里x
表示的是一个数字)或者是++
,就表示让这个指针前进x
个或者1
个数据类型所占用的空间大小。 -
指针的减法:(环境:Windows11 (arm/Apple M VM)/Visual Studio 2022/Debug/arm64)
int a; int* p = &a; int* p2 = p; p2--; cout << (p - p2) << endl;
1
这里的
(p - p2)
,是两个指针相减。指针的减法,得出的结果是相差的数据类型的个数。可能不是很好理解,那么我们试一下这样:
如下的命令中,创建了一个
int
类型的数组,数组里面有 5 个元素。之后我们让指针p
指向数组首元素,指针p2
指向数组的最后一个元素(最后一个元素的下标是4
哦)(环境:Windows11 (arm/Apple M VM)/Visual Studio 2022/Debug/arm64)int arr[5]; int* p = &arr[0]; int* p2 = &arr[4]; cout << p2 - p << endl;
4
这是因为,
arr[4]
与arr[0]
之间相差了4
个元素。指针的减法表示的是两个内存空间之中相差了几个元素。
:-)