指针是C/C++中非常非常重要的概念,指针可以用于存储内存地址,动态分配内存等。在项目开发中应用比较频繁,可以简化一些程序任务的执行。学会使用指针是作为C++程序猿必备的技能。
指针有多种类型,每种类型都有其特定的用途。
指针的概念
指针实则是一个变量,不过其值指向的是另一个变量的地址,即指针变量存储另一个变量的直接地址。
在使用指针变量时,和普通变量一样,我们需要在使用前对指针变量进行声明。
声明格式如下:
type *var_name;
- type:指针基类型,C/C++的数据类型,如:
int
、char
、double
、float
等,但是不管数据类型是哪种,其指针值都是代表一个内存地址。 - var_name:变量名称
*
:用于声明指针,和乘法的符号是一样的。
指针的类型
空指针(Null Pointer)
空指针是一个不指向任何有效内存地址的指针。通常用nullptr(C++11及以后)或NULL(C++11之前)来表示。
空指针是用于初始化指针,表示指针当前不指向任何对象。
int *ptr = nullptr;
野指针(Dangling Pointer)
野指针指向的内存地址可能已经被释放或不再有效,这时如果程序调用到了改地址,可能会导致程序崩溃或未定义行为。
避免产生野指针的方法:在指针所指地址被释放内存后,将指针设置为nullptr。
悬空指针 (Uninitialized Pointer)
悬空指针是未被初始化的指针,指向一个随机的内存地址。如果使用一个未初始化的指针,可能导致未定义行为。
建议在声明指针时对指针进行初始化,指向 nullptr
。示例参考空指针代码。
常量指针(Pointer to Constant)
常量指针是指向常量数据的指针,不能通过该指针修改所指向的值,用 const
标识,主要用于保护常量数据不被修改。
const int value = 10;
const int *ptr = &value;
指针常量(Constant Pointer)
指针常量,即指针本身就是常量,不能改变指向的地址,但可以修改所指向的值,在声明时使用 *const
标识。所指向的值,是指指针指向的变量,这个变量是可以被修改的。不能修改的是指针指向这个变量的关系。
指针常量主要用于固定指针的地址。
int value = 10;
int *const ptr = &value;
常量指针常量 (Constant Pointer to Constant)
常量指针常量,即指针和指向的值都是常量,既不能改变指向的地址,也不能修改所指向的值。同时使用 const
和 *const
标识。常量指针常量可以完全保护数据和指针,所指向的指和地址均不可被修改。
const int value = 10;
const int *const ptr = &value;
函数指针(Function Pointer)
函数指针是指向函数的指针,可以用来调用函数。可以通过函数指针实现回调函数和动态函数调用。
void myFunction() {
// Function code
}
void (*funcPtr)() = myFunction;
funcPtr(); // 调用函数
指针数组(Array of Pointers):
指针数组,即数组的每个元素都是一个指针。用于存储多个指针,常用于字符串数组,也可以结合指针函数,对指针函数进行管理。
const char *arr[] = {"Hello", "World"};
向指针的指针 (Pointer to Pointer):
顾名思义,这就是指向另一个指针的指针。在多级间接寻址的方案中,常用于动态分配二维数组,通过双重指针实现二维数组。
int value = 10;
int *ptr = &value;
int **ptrToPtr = &ptr;
指针的使用
指针使用是会用到 &
和 *
符号,&
即取一个变量的地址,*
即返回指针所指向变量的值。示例代码如下:
#include <iostream>
using namespace std;
int main ()
{
int age = 19; // 实际变量的声明
int *p; // 指针变量的声明
p = &age; // 在指针变量中存储 age 的地址
cout << "age变量的值:";
cout << age << endl;
// 输出在指针变量中存储的地址
cout << "指针变量存储的地址:";
cout << p << endl;
// 访问指针中地址的值
cout << "指针变量所指向的值:";
cout << *p << endl;
return 0;
}
上诉代码执行后输出:
age变量的值:18
指针变量存储的地址:0xbfc601ac
指针变量所指向的值:18