在 C++ 中,指针 是一个强大且灵活的工具,但它也是初学者学习中的难点之一。今天我们将从基础开始,逐步剖析指针的定义、操作、用途,以及常见的错误和注意事项,帮助你彻底掌握它。
1. 什么是指针?
指针是一个变量,它存储的是另一个变量的地址。换句话说,指针是用来“指向”某个内存地址的工具。
示例:
int a = 10; // 定义一个整型变量
int* p = &a; // 定义一个指针变量 p,并将 a 的地址赋值给它
在这里:
a是普通变量,值为10。&a是变量a的地址。p是一个指针,指向变量a的地址。
2. 定义和初始化指针
指针的定义:
类型名* 指针变量名;
示例代码:
int a = 5;
int* p = &a; // 指针 p 指向变量 a
int*表示指针变量p是用来存储整型变量的地址。&a获取变量a的地址。
注意:
指针定义时未赋值,会导致野指针问题。建议在定义时将其初始化:
int* p = nullptr; // 指针初始化为空指针
3. 使用指针访问值
通过指针可以访问它指向的变量的值,使用 解引用操作符 *。
示例代码:
#include <iostream>
using namespace std;
int main() {
int a = 10;
int* p = &a;
cout << "a 的值: " << a << endl; // 输出变量 a 的值
cout << "p 指向的值: " << *p << endl; // 解引用指针 p,获取 a 的值
return 0;
}
运行结果:
a 的值: 10
p 指向的值: 10
4. 指针的用途
-
动态内存分配:指针是实现动态内存分配的核心工具。例如,通过
new和delete操作符,可以动态分配和释放内存。示例代码:
int* p = new int(42); // 动态分配一个整型内存,并赋初值为 42 cout << *p << endl; // 输出动态内存中的值 delete p; // 释放动态分配的内存 -
传递大数据到函数中使用指针可以避免将大数据拷贝到函数内,从而提高效率。
void modify(int* p) { *p = 20; // 修改指针指向变量的值 } int main() { int a = 10; modify(&a); cout << a << endl; // 输出 20 return 0; } -
实现数据结构:指针是实现链表、树、图等数据结构的核心工具。
5. 指针和数组
数组名实际上是一个指针,指向数组的第一个元素。
示例代码:
#include <iostream>
using namespace std;
int main() {
int arr[3] = {10, 20, 30};
int* p = arr; // 指针 p 指向数组的首元素
cout << "数组的第一个元素: " << *p << endl; // 解引用指针
cout << "数组的第二个元素: " << *(p + 1) << endl; // 指针移动
return 0;
}
运行结果:
数组的第一个元素: 10
数组的第二个元素: 20
6. 常见指针错误及注意事项
野指针
- 指针在未初始化或已经释放内存后继续使用,会导致不可预知的行为。
int* p; // 未初始化 *p = 10; // 错误,指针指向未知内存空指针检查
int* p = nullptr; if (p != nullptr) { cout << *p; }内存泄漏
- 动态分配的内存如果没有释放,会导致内存泄漏。
int* p = new int(5); // 忘记 delete p 会导致内存泄漏总结
指针虽然是 C++ 中的难点,但它为程序提供了灵活性和强大的功能。通过本文的学习,相信你已经掌握了指针的基础用法和常见场景。下一步可以学习更多关于指针的高级内容,如指针数组、函数指针等。
想要更多优质的 C++ 内容?快来加入我的知识星球,和大家一起学习进步!点击下方链接加入:
期待与你在星球相遇!如果觉得文章对你有帮助,记得点个赞或分享哦! 👇

被折叠的 条评论
为什么被折叠?



