V信公众号: 程序员架构笔记
欢迎关注
指针的概念与使用
指针是C++中一种特殊的变量,它存储的是另一个变量的内存地址。通过指针,可以直接访问和操作该内存地址上的数据。
声明指针
int* ptr; // 声明一个指向int类型的指针
初始化指针
int x = 10; int* ptr = &x; // ptr指向x的地址
使用指针
cout << *ptr; // 输出ptr指向的值,即x的值(10) *ptr = 20; // 通过指针修改x的值 cout << x; // 输出20
2. 指针与数组
数组名本质上是一个指向数组第一个元素的指针。可以通过指针来遍历数组。
数组与指针的关系
int arr[3] = {1, 2, 3}; int* ptr = arr; // ptr指向数组的第一个元素 cout << *ptr; // 输出1 cout << *(ptr + 1); // 输出2
指针遍历数组
for (int i = 0; i < 3; i++) { cout << *(ptr + i) << " "; // 输出1 2 3 }
3. 引用与指针的区别
引用是C++中的一种别名机制,它为已存在的变量提供了一个别名。引用与指针有相似之处,但也有重要区别。
引用与指针的区别:
-
初始化:
-
引用必须在声明时初始化,且不能改变其引用的对象。
-
指针可以在声明时不初始化,并且可以随时指向不同的对象。
-
-
语法:
-
引用使用
&
符号声明,使用时不需要解引用操作符*
。 -
指针使用
*
符号声明,使用时需要解引用操作符*
。
-
-
空值:
-
引用不能为
nullptr
,必须指向一个有效的对象。 -
指针可以为
nullptr
,表示不指向任何对象。
-
示例:
int x = 10; int& ref = x; // ref是x的引用 int* ptr = &x; // ptr指向x ref = 20; // 修改x的值 cout << x; // 输出20 *ptr = 30; // 通过指针修改x的值 cout << x; // 输出30
4. 动态内存分配:new
和 delete
C++允许在运行时动态分配内存,使用new
和delete
操作符来管理堆内存。
动态分配单个对象
int* ptr = new int; // 动态分配一个int类型的内存 *ptr = 10; // 给分配的内存赋值 delete ptr; // 释放内存
动态分配数组
int* arr = new int[10]; // 动态分配一个包含10个int的数组 arr[0] = 1; // 给数组赋值 delete[] arr; // 释放数组内存
注意事项:
-
使用
new
分配的内存必须使用delete
释放,否则会导致内存泄漏。 -
对于数组,必须使用
delete[]
来释放内存。
示例:
int* ptr = new int(5); // 动态分配一个int并初始化为5 cout << *ptr; // 输出5 delete ptr; // 释放内存 int* arr = new int[3]{1, 2, 3}; // 动态分配并初始化数组 cout << arr[1]; // 输出2 delete[] arr; // 释放数组内存
总结
-
指针用于存储内存地址,可以通过指针间接访问和修改数据。
-
数组名本质上是一个指针,指向数组的第一个元素。
-
引用是变量的别名,必须在声明时初始化,且不能改变其引用的对象。
-
动态内存分配使用
new
和delete
来管理堆内存,避免内存泄漏。