» C++快速入门 » 1. 基础篇 » 1.6 指针

指针

指针是一个可以保存另一个变量地址的变量。

int* a; // `a` 是指向 int 类型的指针
double *ptrPi; // `ptrPi` 是指向 double 类型的指针

地址解析

地址运算符 & 用于获取变量的内存地址。

#include <iostream>

int main() {
    // 声明变量
    int number = 42;

    // 显示变量的值和地址
    std::cout << "Value of number: " << number << std::endl;
    std::cout << "Address of number: " << &number << std::endl;

    return 0;
}

解引用

解引用运算符 * 用于访问指针指向的特定内存地址处存储的值。

例如:

#include <iostream>

int main() {
    // 声明变量
    int number = 58;

    // 获取其地址
    int* pointerToNumber = &number;

    // 显示变量的值和地址
    std::cout << "Value through pointer: " << *pointerToNumber << std::endl;
    std::cout << "Address stored in pointer: " << pointerToNumber << std::endl;

    return 0;
}

解引用运算符允许操作指针指向的内存位置处的值。在 C++ 中使用指针操作非常重要。

指针算术

在 C++ 中,指针算术指对指针进行算术运算,以访问它们指向的内存位置。这常用于处理数组或动态分配的内存。

#include <iostream>

int main() {
    // 创建一个整数数组
    int numbers[] = {10, 20, 30, 40, 50};

    // 声明指向数组第一个元素的指针
    int* ptr = numbers;

    // 使用指针算术访问元素
    std::cout << "Element at index 0: " << *ptr << std::endl;
    std::cout << "Element at index 1: " << *(ptr + 1) << std::endl;
    std::cout << "Element at index 2: " << *(ptr + 2) << std::endl;

    // 将指针移到下一个元素
    ptr++;

    // 使用更新后的指针访问下一个元素
    std::cout << "Element at index 1 (after pointer increment): " << *ptr << std::endl;

    // 将指针移回上一个元素
    ptr--;

    // 使用更新后的指针访问上一个元素
    std::cout << "Element at index 0 (after pointer decrement): " << *ptr << std::endl;

    // 使用索引进行指针算术
    int index = 2;
    std::cout << "Element at index " << index << ": " << *(ptr + index) << std::endl;

    return 0;
}

堆分配

在 C++ 中,堆分配指的是从堆中动态分配内存。“”是由程序员管理的内存区域。 这与“”相反,栈由系统自动管理,具有有限的大小。 开发者可使用 new 运算符分配内存,使用 delete 运算符释放内存,以实现动态内存分配。

#include <iostream>

int main() {
    // 在堆上动态分配一个整数
    int* dynamicInt = new int;

    // 为动态分配的整数赋值
    *dynamicInt = 42;

    std::cout << "Value stored in dynamicInt: " << *dynamicInt << std::endl;

    // 释放动态分配的内存
    delete dynamicInt;

    return 0;
}

注意,对于每个 new,应该有一个相应的 delete,以避免内存泄漏。

#include <iostream>

int main() {
    // 在堆上动态分配一个整数数组
    int* dynamicArray = new int[5];

    for (int i = 0; i < 5; ++i) {
        dynamicArray[i] = i * 10;
    }
    for (int i = 0; i < 5; ++i) {
        std::cout << "Element at index " << i << ": " << dynamicArray[i] << std::endl;
    }

    // 释放动态分配的数组
    delete[] dynamicArray;

    return 0;
}

按引用传递

出于可读性空引用安全性的考虑,C++ 引入了“引用传递”。它负责将变量的内存地址(引用)传递给函数,而不是其值。这使得函数可在不拷贝值的情况下直接操作原始变量,比传值更高效。引用传递语法使用 & 符号。

#include <iostream>

// 接受整数引用的函数
void incrementByReference(int &num) {
    num++;
}

int main() {
    int value = 5;

    std::cout << "Original value: " << value << std::endl;

    // 将变量 'value' 通过引用传递给函数
    incrementByReference(value);

    std::cout << "Value after incrementing by reference: " << value << std::endl;

    return 0;
}

代码挑战

写一个 C++ 程序,使用指针交换两个变量的值。

Loading...
> 此处输出代码运行结果
上页
下页