C++ 指针的算术运算
指针是一个用数值表示的地址。因此,您可以对指针执行算术运算。可以对指针进行四种算术运算:++、--、+、-。
假设 ptr 是一个指向地址 1000 的整型指针,是一个 32 位的整数,让我们对该指针执行下列的算术运算:
ptr++
执行 ptr++ 后,指针 ptr 会向前移动 4 个字节,指向下一个整型元素的地址。这是由于指针算术运算会根据指针的类型和大小来决定移动的距离。在这种情况下,由于是一个 32 位整数指针,每个整数占据 4 个字节,因此 ptr++ 会将指针 ptr 向前移动 4 个字节,指向下一个整型元素的地址。
如果 ptr 指向一个地址为 1000 的字符,执行 ptr++ 指针 ptr 的值会增加,指向下一个字符元素的地址,由于 ptr 是一个字符指针,每个字符占据 1 个字节,因此 ptr++ 会将 ptr 的值增加 1,执行后 ptr 指向地址 1001。
指针算术运算的详细解析:
加法运算:可以对指针进行加法运算。当一个指针p加上一个整数n时,结果是指针p向前移动n个元素的大小。例如,如果p是一个int类型的指针,每个int占4个字节,那么p + 1将指向p所指向的下一个int元素。
减法运算:可以对指针进行减法运算。当一个指针p减去一个整数n时,结果是指针p向后移动n个元素的大小。例如,如果p是一个int类型的指针,每个int占4个字节,那么p - 1将指向p所指向的前一个int元素。
指针与指针之间的减法运算:可以计算两个指针之间的距离。当从一个指针p减去另一个指针q时,结果是两个指针之间的元素个数。例如,如果p和q是两个int类型的指针,每个int占4个字节,那么p - q将得到两个指针之间的元素个数。
指针与整数之间的比较运算:可以将指针与整数进行比较运算。可以使用关系运算符(如<、>、<=、>=)对指针和整数进行比较。这种比较通常用于判断指针是否指向某个有效的内存位置。
递增一个指针
我们喜欢在程序中使用指针代替数组,因为变量指针可以递增,而数组不能递增,因为数组是一个常量指针。下面的程序递增变量指针,以便顺序访问数组中的每一个元素:
实例
当上面的代码被编译和执行时,它会产生下列结果:
Address of var[0] = 0xbfa088b0 Value of var[0] = 10 Address of var[1] = 0xbfa088b4 Value of var[1] = 100 Address of var[2] = 0xbfa088b8 Value of var[2] = 200
递减一个指针
同样地,对指针进行递减运算,即把值减去其数据类型的字节数,如下所示:
实例
当上面的代码被编译和执行时,它会产生下列结果:
Address of var[3] = 0xbfdb70f8 Value of var[3] = 200 Address of var[2] = 0xbfdb70f4 Value of var[2] = 100 Address of var[1] = 0xbfdb70f0 Value of var[1] = 10
指针的比较
指针可以用关系运算符进行比较,如 ==、< 和 >。如果 p1 和 p2 指向两个相关的变量,比如同一个数组中的不同元素,则可对 p1 和 p2 进行大小比较。
下面的程序修改了上面的实例,只要变量指针所指向的地址小于或等于数组的最后一个元素的地址 &var[MAX - 1],则把变量指针进行递增:
实例
当上面的代码被编译和执行时,它会产生下列结果:
Address of var[0] = 0xbfce42d0 Value of var[0] = 10 Address of var[1] = 0xbfce42d4 Value of var[1] = 100 Address of var[2] = 0xbfce42d8 Value of var[2] = 200
C++ 指针
yang
188***31683@163.com
指针指向数组的时候,不可以加 &:
#include <iostream> using namespace std; int main() { int var[5] = {1,2,3,4,5}; // 实际变量的声明 int *ip; // 指针变量的声明 ip = &var; // 在指针变量中存储 var 的地址 cout << "Value of var variable: "; cout << var << endl; // 输出在指针变量中存储的地址 cout << "Address stored in ip variable: "; cout << ip << endl; // 访问指针中地址的值 cout << "Value of *ip variable: "; *ip = 30; cout << *ip << endl; cout << var << endl; system("pause"); return 0; }yang
188***31683@163.com
joiln
29a***ina.cn
指针指向数组中某一元素时要用 &。
#include <iostream> using namespace std; int main() { int var[5] = {1,2,3,4,5}; // 实际变量的声明 int *ip; // 指针变量的声明 int *ip_1; //ip = &var; //指针指向数组的时候不用 “&”取址符 //ip = &var[2] //指针指向数组某一元素时要用 “&”取址符 ip = var; // 在指针变量中存储 var 的地址 ip_1 = &var[2]; // 在指针变量中存储 var[2] 的地址 cout << "Value of var variable: "; cout << var << endl; // 输出在指针变量中存储的地址 cout << "Address stored in ip variable: "; cout << ip << endl; // 访问指针中地址的值 cout << "Value of *ip variable: "; *ip = 30; cout << *ip << endl; cout << "\t" << var << endl; // 打印指针指向数组的某一元素的值 cout << "Value of *ip_1 variable:"; cout << *ip_1 << endl; // system("pause"); return 0; }joiln
29a***ina.cn
bpink
125***7126@qq.com
对楼上的 & 进行补充说明,& 并不是不能用在数组名上,只是用在数组名和数组名[i]有所区别。例如:
上面 &height[0] 就是取得是数组第一个元素的地址,假设地址为 1000;&height 是直接对数组名进行取地址,这个时候就是取得是 height 整个数组的地址,指向包含 10 个元素的 int 型数组,地址范围为 1000~1036;
我们知道 height 等价于 &height[0],height+1 会将地址加 4 个字节;但 &height+1 就是将地址增加 10*4 个字节。
bpink
125***7126@qq.com
ChaosShu
453***330@qq.com
感觉楼上的几位说的有点矛,我直接跑了一下看结果(建议直接看结论):
short int height[10]; //int型的数组(short int 每个数据2字节) cout << "height "<< height << endl << "height+1 "<< height + 1 << endl << "&height[0] " << &height[0] << endl << "&height+1 "<< &height + 1<< endl << "height+9 "<< height+9 << endl << "height+10 " << height + 10 << endl;结果如下:
可以看到:
结论:bpink(3楼)说的是对的。
ChaosShu
453***330@qq.com
siyuan
a95***7c@qq.com
补充一下 其实一、二楼说的不完整,并不是指针指向数组时不能带 &,而是类型不符导致你不能用 &:
int arr[] = { 1, 2, 3, 4, 5 }; // 错误 int *arrPtr; arrPtr = &arr; // 正确 int (*arrPtr)[5]; arrPtr = &arr;完事
siyuan
a95***7c@qq.com