指针变量的算术运算
- 1.指针与整数的加减运算:对指针变量加上或减去一个整数,表示将该指针后移或前移确定的存储单元。
- 2.两个同类型指针的减法运算:对两个相同类型的指针变量进行减运算,表示这两个指针间有多少存储单元。
- 3.对指针变量加上或减去一个浮点数、进行乘、除等算术运算,对两个指针变量进行加、乘、除等算术运算通常没有实际意义。
- 代码示例1:
-
#include <iostream> using namespace std; int main() { // 示例1:指针加减整数 int arr[] = {10, 20, 30, 40, 50}; int* p = arr; cout << "*(p+3) = " << *(p + 3) << endl; // 输出arr[3] // 示例2:指针自增运算 p = arr; cout << "初始*p = " << *p << endl; p++; cout << "p++后*p = " << *p << endl; // 示例3:指针相减 int* p1 = &arr[1]; int* p2 = &arr[4]; cout << "p2-p1 = " << p2 - p1 << endl; // 示例4:不同类型指针运算 double darr[] = {1.1, 2.2, 3.3}; double* dp = darr; cout << "double指针+1地址差: " << (char*)(dp + 1) - (char*)dp << "字节" << endl; return 0; }
运行结果:
-
*(p+3) = 40 初始p = 10 p++后p = 20 p2-p1 = 3 double指针+1地址差: 8字节
-
分析:
- *(p+3) 输出40,因为p+3指向arr[3]。
- p++操作后*p输出20,指针移动了sizeof(int)字节(通常4字节)。
- p2-p1输出3,表示两指针间隔3个int元素。
- double指针+1地址差输出8,反映double类型占8字节的特性。
- 代码示例2:
#include <iostream> using namespace std; int main() { // 示例1:数组遍历 int arr[] = {10, 20, 30, 40, 50}; int* p = arr; cout << "数组遍历结果:" << endl; for (int i = 0; i < 5; i++) { cout << "arr[" << i << "] = " << *(p + i) << " (地址:" << p + i << ")" << endl; } // 示例2:指针自增运算 p = arr; cout << "\n指针自增演示:" << endl; cout << "初始值: *p = " << *p << endl; p++; cout << "p++后: *p = " << *p << " 地址增加" << sizeof(int) << "字节" << endl; // 示例3:指针相减 int* p1 = &arr[1]; int* p2 = &arr[4]; cout << "\n指针相减结果:" << endl; cout << "p2 - p1 = " << p2 - p1 << " 间隔" << p2 - p1 << "个元素" << endl; // 示例4:不同类型指针运算 char char_arr[] = {'a','b','c'}; char* cp = char_arr; cout << "\nchar类型指针运算:" << endl; cout << "cp=" << (void*)cp << ", cp+1=" << (void*)(cp+1) << " 增加" << sizeof(char) << "字节" << endl; return 0; }
运行结果:
-
数组遍历结果: arr[0] = 10 (地址:0x7ffc3a4b8b10) arr[1] = 20 (地址:0x7ffc3a4b8b14) arr[2] = 30 (地址:0x7ffc3a4b8b18) arr[3] = 40 (地址:0x7ffc3a4b8b1c) arr[4] = 50 (地址:0x7ffc3a4b8b20) 指针自增演示: 初始值: *p = 10 p++后: *p = 20 (地址增加4字节) 指针相减结果: p2 - p1 = 3 (间隔3个元素) char类型指针运算: cp=0x7ffc3a4b8b0a, cp+1=0x7ffc3a4b8b0b (增加1字节)