指针

什么是指针?

指针是存储其他变量内存地址的变量。它们提供对内存的直接访问,并支持动态内存分配。

基本指针示例

#include <iostream>
using namespace std;

int main() {
    int number = 42;
    int* ptr = &number;  // ptr stores the address of number
    
    cout << "Value of number: " << number << endl;
    cout << "Address of number: " << &number << endl;
    cout << "Value stored in ptr: " << ptr << endl;
    cout << "Value pointed to by ptr: " << *ptr << endl;
    
    // Modify value through pointer
    *ptr = 100;
    cout << "After modifying through pointer:" << endl;
    cout << "Value of number: " << number << endl;
    
    return 0;
}

指针操作

关键的指针操作包括声明、赋值、解引用和算术运算:

指针操作

#include <iostream>
using namespace std;

int main() {
    int arr[] = {10, 20, 30, 40, 50};
    int* ptr = arr;  // Points to first element
    
    cout << "Array traversal using pointer arithmetic:" << endl;
    for (int i = 0; i < 5; i++) {
        cout << "Element " << i << ": " << *(ptr + i) << endl;
    }
    
    cout << "\nUsing pointer increment:" << endl;
    ptr = arr;  // Reset pointer
    for (int i = 0; i < 5; i++) {
        cout << "Element " << i << ": " << *ptr << endl;
        ptr++;  // Move to next element
    }
    
    // Pointer comparison
    int* start = arr;
    int* end = arr + 5;
    
    cout << "\nPointer comparison:" << endl;
    cout << "Distance between pointers: " << (end - start) << endl;
    
    return 0;
}

引用

引用是现有变量的别名。与指针不同,它们不能为空,必须在声明时初始化。

引用与指针

#include <iostream>
using namespace std;

void swapWithPointers(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

void swapWithReferences(int& a, int& b) {
    int temp = a;
    a = b;
    b = temp;
}

int main() {
    int x = 10, y = 20;
    
    cout << "Original values: x = " << x << ", y = " << y << endl;
    
    // Using pointers
    swapWithPointers(&x, &y);
    cout << "After pointer swap: x = " << x << ", y = " << y << endl;
    
    // Using references
    swapWithReferences(x, y);
    cout << "After reference swap: x = " << x << ", y = " << y << endl;
    
    // Reference as alias
    int number = 100;
    int& ref = number;  // ref is an alias for number
    
    cout << "\nReference example:" << endl;
    cout << "number = " << number << ", ref = " << ref << endl;
    
    ref = 200;  // Modifying through reference
    cout << "After modifying ref: number = " << number << endl;
    
    return 0;
}

动态内存分配

使用 new 和 delete 操作符进行动态内存管理:

动态内存示例

#include <iostream>
using namespace std;

int main() {
    // Allocate single integer
    int* ptr = new int(42);
    cout << "Dynamically allocated integer: " << *ptr << endl;
    delete ptr;  // Free memory
    
    // Allocate array
    int size = 5;
    int* arr = new int[size];
    
    // Initialize array
    for (int i = 0; i < size; i++) {
        arr[i] = (i + 1) * 10;
    }
    
    cout << "Dynamically allocated array: ";
    for (int i = 0; i < size; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;
    
    delete[] arr;  // Free array memory
    
    // Always set pointers to nullptr after deletion
    ptr = nullptr;
    arr = nullptr;
    
    return 0;
}

常见指针陷阱

空指针解引用

在解引用之前始终检查指针是否不为空

内存泄漏

每个 new 都必须有对应的 delete

悬空指针

不要在内存被释放后使用指针

重复删除

不要重复删除同一块内存