指针
什么是指针?
指针是存储其他变量内存地址的变量。它们提供对内存的直接访问,并支持动态内存分配。
基本指针示例
#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
悬空指针
不要在内存被释放后使用指针
重复删除
不要重复删除同一块内存