C++ 指针的算术运算
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将得到两个指针之间的元素个数。
指针与整数之间的比较运算:可以将指针与整数进行比较运算。可以使用关系运算符(如<、>、<=、>=)对指针和整数进行比较。这种比较通常用于判断指针是否指向某个有效的内存位置。
在C++中,指针是一个变量,它存储一个内存地址。递增一个指针意味着将指针指向下一个内存位置,这通常是指向下一个数组元素。递增一个指针会根据指针所指向的数据类型自动调整指针的值。
实例
#include <iostream>
int main() {
int arr[] = {10, 20, 30, 40, 50};
int* ptr1 = &arr[1]; // 指向数组的第二个元素
int* ptr2 = &arr[3]; // 指向数组的第四个元素
// 比较指针的相对位置
if (ptr1 < ptr2) {
std::cout << "ptr1 指向的元素在 ptr2 指向的元素之前" << std::endl;
} else {
std::cout << "ptr1 指向的元素不在 ptr2 指向的元素之前" << std::endl;
}
if (ptr2 > ptr1) {
std::cout << "ptr2 指向的元素在 ptr1 指向的元素之后" << std::endl;
} else {
std::cout << "ptr2 指向的元素不在 ptr1 指向的元素之后" << std::endl;
}
return 0;
}
实例
#include <iostream>
int main() {
int arr[] = {10, 20, 30, 40, 50};
int* ptr1 = &arr[1]; // 指向数组的第二个元素
int* ptr2 = &arr[3]; // 指向数组的第四个元素
int* ptr3 = &arr[1]; // 指向数组的第二个元素
// 相等性比较
if (ptr1 == ptr3) {
std::cout << "ptr1 和 ptr3 指向相同的位置" << std::endl;
} else {
std::cout << "ptr1 和 ptr3 指向不同的位置" << std::endl;
}
if (ptr1 != ptr2) {
std::cout << "ptr1 和 ptr2 指向不同的位置" << std::endl;
} else {
std::cout << "ptr1 和 ptr2 指向相同的位置" << std::endl;
}
// 关系比较
if (ptr1 < ptr2) {
std::cout << "ptr1 指向的元素在 ptr2 指向的元素之前" << std::endl;
} else {
std::cout << "ptr1 指向的元素不在 ptr2 指向的元素之前" << std::endl;
}
if (ptr2 > ptr1) {
std::cout << "ptr2 指向的元素在 ptr1 指向的元素之后" << std::endl;
} else {
std::cout << "ptr2 指向的元素不在 ptr1 指向的元素之后" << std::endl;
}
return 0;
}