指针
指针是一个可以保存另一个变量地址的变量。
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...
> 此处输出代码运行结果