菜鸟教程 -- 学的不仅是技术,更是梦想!

C++ 教程
C++ 教程 C++ 简介 C++ 环境设置 C++ 基本语法 C++ 注释 C++ 数据类型 C++ 变量类型 C++ 变量作用域 C++ 常量 C++ 修饰符类型 C++ 存储类 C++ 运算符 C++ 循环 C++ 判断 C++ 函数 C++ 数字 C++ 数组 C++ 字符串 C++ 指针 C++ 引用 C++ 日期 & 时间 C++ 基本的输入输出 C++ 结构体(struct) C++ vector 容器 C++ 数据结构

C++ 面向对象

C++ 类 & 对象 C++ 继承 C++ 重载运算符和重载函数 C++ 多态 C++ 数据抽象 C++ 数据封装 C++ 接口(抽象类)

C++ 高级教程

C++ 文件和流 C++ 异常处理 C++ 动态内存 C++ 命名空间 C++ 模板 C++ 预处理器 C++ 信号处理 C++ 多线程 C++ Web 编程

C++ 资源库

C++ STL 教程 C++ 导入标准库 C++ 标准库 C++ 有用的资源 C++ 实例 C++ 测验 C++ <iostream> C++ <fstream> C++ <sstream> C++ <iomanip> C++ <array> C++ <vector> C++ <list> C++ <forward_list> C++ <deque> C++ <stack> C++ <queue> C++ <priority_queue> C++ <set> C++ <unordered_set> C++ <map> C++ <unordered_map> C++ <bitset> C++ <algorithm> C++ <iterator> C++ <functional> C++ <numeric> C++ <complex> C++ <valarray> C++ <cmath> C++ <string> C++ <regex> C++ <ctime> C++ <chrono> C++ <thread> C++ <mutex> C++ <condition_variable> C++ <future> C++ <atomic> C++ <type_traits> C++ <typeinfo> C++ <exception> C++ <stdexcept> C++ <cstdio> C++ <cstdint> C++ <memory> C++ <new> C++ <utility> C++ <random> C++ <locale> C++ <codecvt> C++ <cassert> C++ <cwchar> C++ <climits> C++ <cfloat> C++ <cstdlib> C++ <numbers> C++ OpenCV
(追記) (追記ここまで)

C++ 指针的算术运算

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++中,指针是一个变量,它存储一个内存地址。递增一个指针意味着将指针指向下一个内存位置,这通常是指向下一个数组元素。递增一个指针会根据指针所指向的数据类型自动调整指针的值。

例如,如果指针指向一个 int 类型的数组元素,那么递增指针将使其指向下一个 int 元素。下面是一个简单的示例,演示了如何递增一个指针:

实例

#include<iostream>intmain(){// 定义一个数组intarr[] = {10, 20, 30, 40, 50}; // 定义一个指向数组第一个元素的指针int* ptr = arr; // 输出指针指向的元素std::cout << "指针当前指向的元素: " << *ptr << std::endl; // 递增指针ptr++; // 输出指针指向的元素std::cout << "递增指针后指向的元素: " << *ptr << std::endl; return0; }

当上面的代码被编译和执行时,它会产生下列结果:

指针当前指向的元素: 10
递增指针后指向的元素: 20

在这个示例中,指针 ptr 最初指向数组 arr 的第一个元素。通过执行 ptr++,指针 ptr 被递增以指向数组的下一个元素(即第二个元素)。

递增指针时,指针的值将增加一个偏移量,该偏移量等于指针所指向数据类型的大小。例如,如果指针是 int* 类型,每次递增指针将增加4个字节(假设 int 类型占4个字节)。

需要注意的是,当使用指针操作时,要确保指针指向有效的内存区域,否则可能会导致未定义行为或程序崩溃。在操作数组时,尤其要小心避免指针超出数组的范围。

递减一个指针

在C++中,指针不仅可以递增,也可以递减。递减一个指针意味着将指针指向前一个内存位置。与递增指针类似,递减指针也会根据指针所指向的数据类型自动调整指针的值。

下面是一个简单的示例,演示了如何递减一个指针:

实例

#include<iostream>intmain(){// 定义一个数组intarr[] = {10, 20, 30, 40, 50}; // 定义一个指向数组第二个元素的指针int* ptr = &arr[1]; // 输出指针当前指向的元素std::cout << "指针当前指向的元素: " << *ptr << std::endl; // 递减指针ptr--; // 输出指针递减后指向的元素std::cout << "递减指针后指向的元素: " << *ptr << std::endl; return0; }

当上面的代码被编译和执行时,它会产生下列结果:

指针当前指向的元素: 20
递减指针后指向的元素: 10

在这个示例中,指针 ptr 最初指向数组 arr 的第二个元素。通过执行 ptr--,指针 ptr 被递减以指向数组的第一个元素。

递减指针时,指针的值将减少一个偏移量,该偏移量等于指针所指向数据类型的大小。例如,如果指针是 int* 类型,每次递减指针将减少4个字节(假设 int 类型占4个字节)。

指针的比较

在C++中,指针的比较操作可以用于确定两个指针是否指向相同的位置、一个指针是否指向的位置在另一个指针之前或之后等。指针的比较主要包括以下几种:

  • 相等性比较 (==!=)
  • 关系比较 (<, <=, >, >=)

相等性比较

相等性比较用于检查两个指针是否指向相同的位置。

实例

#include <iostream>

int main() {
int a = 10;
int b = 20;
int* ptr1 = &a;
int* ptr2 = &a;
int* ptr3 = &b;

// 比较指针是否相等
if (ptr1 == ptr2) {
std::cout << "ptr1 和 ptr2 指向相同的位置" << std::endl;
} else {
std::cout << "ptr1 和 ptr2 指向不同的位置" << std::endl;
}

if (ptr1 != ptr3) {
std::cout << "ptr1 和 ptr3 指向不同的位置" << std::endl;
} else {
std::cout << "ptr1 和 ptr3 指向相同的位置" << std::endl;
}

return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

ptr1 和 ptr2 指向相同的位置
ptr1 和 ptr3 指向不同的位置

关系比较

关系比较用于确定一个指针是否指向的位置在另一个指针之前或之后。这通常在指针指向同一个数组的元素时有意义。

实例

#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;
}

当上面的代码被编译和执行时,它会产生下列结果:

ptr1 指向的元素在 ptr2 指向的元素之前
ptr2 指向的元素在 ptr1 指向的元素之后

指针比较的完整例子:

实例

#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;
}

当上面的代码被编译和执行时,它会产生下列结果:

ptr1 和 ptr3 指向相同的位置
ptr1 和 ptr2 指向不同的位置
ptr1 指向的元素在 ptr2 指向的元素之前
ptr2 指向的元素在 ptr1 指向的元素之后

注意事项

  • 同一数组范围内的比较: 关系比较(如 <, >, <=, >=)在同一数组的元素之间进行是有意义的。如果指针不属于同一个数组,关系比较的结果是未定义的。

  • 指针为空: 在比较指针之前,确保指针不是空指针(nullptr),否则可能会导致未定义行为。

C++ 指针 C++ 指针

AI 思考中...

5 篇笔记 写笔记

  1. #0

    yang

    188***[email protected]

    88

    指针指向数组的时候,不可以加 &:

    #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***[email protected]

    7年前 (2019年07月11日)
  2. #0

    joiln

    29a***ina.cn

    50

    指针指向数组中某一元素时要用 &

    #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

    7年前 (2019年07月17日)
  3. #0

    bpink

    125***[email protected]

    171

    对楼上的 & 进行补充说明,& 并不是不能用在数组名上,只是用在数组名和数组名[i]有所区别。例如:

    int height[10];//int型的数组
    cout << &height << endl;//&用在数组名上
    cout << &height[0] << endl;//&用在数组第一个元素上

    上面 &height[0] 就是取得是数组第一个元素的地址,假设地址为 1000;&height 是直接对数组名进行取地址,这个时候就是取得是 height 整个数组的地址,指向包含 10 个元素的 int 型数组,地址范围为 1000~1036;

    我们知道 height 等价于 &height[0],height+1 会将地址加 4 个字节;但 &height+1 就是将地址增加 10*4 个字节。

    bpink

    125***[email protected]

    7年前 (2019年07月22日)
  4. #0

    ChaosShu

    453***[email protected]

    302

    感觉楼上的几位说的有点矛,我直接跑了一下看结果(建议直接看结论):

    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;

    结果如下:

    height 0136F900
    height+1 0136F902
    &height[0] 0136F900
    &height+1 0136F914
    height+9 0136F912
    height+10 0136F914

    可以看到:

    • height 与 &height[0] 值相等。
    • height+1 = height + 2 字节 = height + 1 个 short int 也即 一个数组元素。
    • height+9 为 height[] 中最后一个元素的地址,height+10 为该数组结束后的第一个地址。
    • &height +1=height+10,即执行 &height+1 的结果是地址跳到整个数组之后第一个地址。

    结论:bpink(3楼)说的是对的。

    ChaosShu

    453***[email protected]

    7年前 (2019年09月10日)
  5. #0

    siyuan

    a95***[email protected]

    29

    补充一下 其实一、二楼说的不完整,并不是指针指向数组时不能带 &,而是类型不符导致你不能用 &:

    int arr[] = { 1, 2, 3, 4, 5 };
    // 错误
    int *arrPtr;
    arrPtr = &arr;
    // 正确
    int (*arrPtr)[5];
    arrPtr = &arr;

    完事

    siyuan

    a95***[email protected]

    4年前 (2022年11月29日)

点我分享笔记

  • 昵称 (必填)
  • 邮箱 (必填)
  • 引用地址

AltStyle によって変換されたページ (->オリジナル) /