指针的艺术——指针是什么?

51 阅读4分钟

指针是C/C++中非常非常重要的概念,指针可以用于存储内存地址,动态分配内存等。在项目开发中应用比较频繁,可以简化一些程序任务的执行。学会使用指针是作为C++程序猿必备的技能。

指针有多种类型,每种类型都有其特定的用途。

指针的概念

指针实则是一个变量,不过其值指向的是另一个变量的地址,即指针变量存储另一个变量的直接地址。

在使用指针变量时,和普通变量一样,我们需要在使用前对指针变量进行声明。

声明格式如下:

type *var_name;
  • type:指针基类型,C/C++的数据类型,如:intchardoublefloat 等,但是不管数据类型是哪种,其指针值都是代表一个内存地址。
  • 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