指针引导:掌握C++内存操控的艺术 1

简介: 指针引导:掌握C++内存操控的艺术

5.1 地址与指针的概念

在 C++ 中,地址与指针是重要的概念,它们在内存管理和程序设计中起到了关键的作用。在本节中,我们将学习地址和指针的概念以及如何在 C++ 中使用它们。


5.1.1 内存地址

内存是计算机用来存储数据和程序的地方。每个内存单元都有唯一的地址。地址是用来访问内存中特定位置的标识符。在 C++ 中,可以使用取地址运算符 & 来获取变量的内存地址。


代码示例:

#include <iostream>
int main() 
{
    int num = 10;
    std::cout << "变量num的内存地址: " << &num << std::endl;
    return 0;
}

输出:

变量num的内存地址:0x7ffc2d6f003c

在上面的例子中,我们声明了一个整型变量 num,使用取地址运算符 & 获取了变量 num 的内存地址,并通过 std::cout 输出了该地址。


5.1.2 变量的地址

在 C++ 中,我们可以将变量的地址存储在指针变量中。指针变量是一种特殊的变量,它用于存储其他变量的地址。可以使用指针变量来间接访问原始变量。


代码示例:

#include <iostream>
int main() 
{
    int num = 10;
    int *ptr = &num;  // 定义一个整型指针变量ptr,将num的地址赋值给ptr
    std::cout << "变量num的内存地址: " << ptr << std::endl;
    std::cout << "指针变量ptr的值: " << *ptr << std::endl;
    return 0;
}

输出:

变量num的内存地址:0x7ffc2d6f003c
指针变量ptr的值:10

在上面的例子中,我们定义了一个整型指针变量 ptr,将变量 num 的地址赋值给了 ptr。然后,我们通过 *ptr 访问了原始变量的值。


5.1.3 变量的指针

在 C++ 中,可以使用指针来操作变量本身。通过改变指针的值,我们可以改变指针所指向的变量的值。


代码示例:

#include <iostream>
int main() 
{
    int num = 10;
    int *ptr = &num;  // 定义一个整型指针变量ptr,将num的地址赋值给ptr
    *ptr = 20;  // 改变指针所指向的变量
    std::cout << "变量num的值: " << num << std::endl;
    return 0;
}

输出:

变量num的值:20

在上面的例子中,我们通过指针变量 ptr 改变了 num 的值。通过 *ptr = 20,我们将指针所指向的变量的值改为了 20。


总结:


地址是用来访问内存中特定位置的标识符。

可以使用取地址运算符 `&获取变量的内存地址。

指针变量是用来存储其他变量的地址的特殊变量。

可以使用指针变量来间接访问原始变量。

可以通过改变指针的值来改变指针所指向的变量的值。

5.2 指针变量及指针运算

5.2.1 指针变量

指针是一种特殊类型的变量,其存储的是内存地址。通过指针可以访问和修改对应地址上存储的数据。下面是一个通过指针变量存取变量值的例子:


【例 5-1】通过指针变量存取变量的值

#include <iostream>
using namespace std;
int main() 
{
    int x = 10; // 定义一个整数变量 x,并赋值为 10
    int *ptr;   // 定义一个指向整数类型的指针变量 ptr
    ptr = &x;   // 将指针变量 ptr 指向 x 的地址
    cout << "x 的值为:" << x << endl;
    cout << "通过指针变量访问 x 的值为:" << *ptr << endl;
    *ptr = 20;  // 修改 ptr 所指向的地址中存储的值
    cout << "修改后 x 的值为:" << x << endl;
    return 0;
}

输出结果:

x 的值为:10
通过指针变量访问 x 的值为:10
修改后 x 的值为:20

在上述例子中,我们通过指针变量 ptr 来存取变量x的值。首先,我们将指针变量 ptr 指向变量 x的地址,然后通过指针变量 ptr 访问变量 x 的值,并且可以通过修改指针变量 ptr 所指向地址中的值来修改变量 x 的值。


【例 5-2】输入 a 和 b 两个整数,按从小到大的顺序输出

#include <iostream>
using namespace std;
void sort(int *a, int *b) 
{
    if (*a > *b) 
    {
        int temp = *a;
        *a = *b;
        *b = temp;
    }
}
int main() 
{
    int a, b;
    cout << "请输入两个整数:" << endl;
    cin >> a >> b;
    sort(&a, &b);
    cout << "从小到大排序后的结果为:" << a << ", " << b << endl;
    return 0;
}

输出结果:

请输入两个整数:
5
3
从小到大排序后的结果为:3, 5

在上述例子中,我们定义了一个函数 sort,该函数接受两个指向整数的指针作为参数。在函数内部,我们通过判断指针所指向的变量的大小关系,交换变量的值,从而实现从小到大的排序。


5.2.2 指针运算

指针变量与整数可以进行加减运算,称为指针运算。下面是一个指针与整数的加减运算的例子:


【例 5-3】指针与整数的加减运算

#include <iostream>
using namespace std;
int main() 
{
    int arr[] = {1, 2, 3, 4, 5};
    int *ptr = arr; // 指向数组的第一个元素的指针
    cout << "ptr 的初始值为:" << ptr << endl;
    ptr += 2; // 将指针加 2
    cout << "ptr 加 2 后的值为:" << ptr << endl;
    ptr -= 1; // 将指针减 1
    cout << "ptr 减 1 后的值为:" << ptr << endl;
    return 0;
}

输出结果:

ptr 的初始值为:0x7ffee418b4a0
ptr 加 2 后的值为:0x7ffee418b4a8
ptr 减 1 后的值为:0x7ffee418b4a4

在上述例子中,我们定义了一个整数数组 arr,并定义了一个指向数组第一个元素的指针 ptr。通过指针加减整数的运算,可以使指针指向数组中的其他元素。


【例 5-4】指针的关系运算

#include <iostream>
using namespace std;
int main() 
{
    int arr[] = {1, 2, 3, 4, 5};
    int *ptr = arr; // 指向数组的第一个元素的指针
    cout << "ptr 的初始值为:" << ptr << endl;
    cout << "指针与整数的关系运算:" << endl;
    for(int i = 0; i < 5; i++) 
    {
        cout << "arr + " << i << " 的值为:" << arr + i << endl;
        if(arr + i == ptr) 
        {
            cout << "arr + " << i << " 等于 ptr" << endl;
        }
    }
    return 0;
}

输出结果:

ptr 的初始值为:0x7ffee418b4a0
指针与整数的关系运算:
arr + 0 的值为:0x7ffee418b4a0
arr + 0 等于 ptr
arr + 1 的值为:0x7ffee418b4a4
arr + 2 的值为:0x7ffee418b4a8
arr + 3 的值为:0x7ffee418b4ac
arr + 4 的值为:0x7ffee418b4b0

在上述例子中,我们通过指针与整数的关系运算来比较指针与数组元素的地址。可以看到,当两者相等时输出相应的信息。

C++学习笔记:指针与数组


相关文章
|
6天前
|
存储 编译器 C语言
【C++】C\C++内存管理
【C++】C\C++内存管理
【C++】C\C++内存管理
|
1天前
|
安全 NoSQL Redis
C++新特性-智能指针
C++新特性-智能指针
|
4天前
|
编译器 C++
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
|
4天前
|
编译器 C++
virtual类的使用方法问题之在C++中获取对象的vptr(虚拟表指针)如何解决
virtual类的使用方法问题之在C++中获取对象的vptr(虚拟表指针)如何解决
|
4天前
|
安全 编译器 容器
C++STL容器和智能指针
C++STL容器和智能指针
|
6天前
|
C++
C++通过文件指针获取文件大小
C++通过文件指针获取文件大小
10 0
|
6天前
|
编译器 C语言 C++
【C++关键字】指针空值nullptr(C++11)
【C++关键字】指针空值nullptr(C++11)
|
7天前
|
算法 C++ 容器
【C++算法】双指针
【C++算法】双指针
|
6天前
|
C++ 容器
C++中自定义结构体或类作为关联容器的键
C++中自定义结构体或类作为关联容器的键
13 0
|
6天前
|
存储 算法 搜索推荐
【C++】类的默认成员函数
【C++】类的默认成员函数

热门文章

最新文章