前言:指针是C/C++编程的一个核心概念,很多编程初学者可能对此感到似懂非懂,力不从心,合理使用指针能够显著提升程序性能,本文将对各类指针做一些解读,帮助大家更好理解与运用。(这里我们所讲的是"裸"指针,非智能指针)。
目录
[2.1 指针常量](#2.1 指针常量)
[2.2 常量指针](#2.2 常量指针)
[2.3 记忆技巧](#2.3 记忆技巧)
[2.4 代码示例](#2.4 代码示例)
[3.1 指针函数](#3.1 指针函数)
[3.2 函数指针](#3.2 函数指针)
一、什么是指针
简单来说,指针就是地址。
举个简单的例子:
cpp
int a = 10;
int *p = &a;//p就是变量a的地址
我们上述代码进行图解:

可以清晰地看到,指针p实际上就是变量a的地址。
二、指针常量与常量指针
2.1 指针常量
顾名思义,指针是常量,限制的是指针本身,指针无法修改指向(但指向的地址里的内容可变)
cpp
int* const p
2.2 常量指针
常量指针,指针指向的地址里的内容是常量,不可修改(但指针指向可变,指针可指向其他地址)
cpp
//写法1
int const* p
//写法2
const int* p
2.3 记忆技巧
看const直接紧跟的是谁,谁就不可修改。
int* const p; 这里const紧跟p,也就是指针本身是常量,即指针常量。
const int* p;这里const紧跟*p,也就是指向的地址里的内容是常量,即常量指针。
2.4 代码示例
cpp
#include <iostream>
using namespace std;
int main() {
int a = 10;
int b = 20;
// 常量指针:指向的内容不能改,指针本身可以改
const int* p1 = &a;
// 错误:不能通过p1修改a的值(*p1是常量)
// *p1 = 100;
// 正确:指针p1本身可以指向其他地址
p1 = &b;
cout << *p1 << endl; // 输出 20
//指针常量:指针本身是常量,不可修改指向,指向内容可修改
int* const p2 = &a;
//正确:可通过p2修改a的值
*p2 = 100;
//错误:指针p2本身是常量,不可修改指向
//p2 = &b;
cout << *p2 << endl; //输出 100
return 0;
}
三、指针函数与函数指针
3.1 指针函数
指针函数,本质是一个函数,函数的返回值是指针类型
语法格式 :返回值类型* 函数名(参数列表)
代码示例:
cpp
// 指针函数:返回int类型指针的函数
int* get_num_ptr() {
static int num = 100; // 用static避免局部变量销毁导致野指针
return # // 返回变量num的地址(指针)
}
上述代码中,注意野指针的问题(野指针:指针指向的内容已被释放,但指针没有赋值为Null)
3.2 函数指针
函数指针,本质是一个指针,指向了函数的入口的地址
语法格式 :返回值类型 (*指针名)(参数列表)
代码示例:
cpp
#include <stdio.h>
// 普通函数:乘法
int mul(int a, int b) {
return a * b;
}
int main() {
// 定义函数指针,指向"返回int、接收两个int参数"的函数
int (*fp)(int, int);
fp = mul; // 函数指针指向mul函数
printf("函数指针调用乘法:%d\n", fp(4, 5)); // 输出:20
return 0;
}
四、二级指针
C语言中存在二级指针的概念,即指针的地址。
一级指针:int *p;
二级指针:int **p;
简单C代码例子:
cpp
int a = 10;
int *p = &a; //p就是变量a的地址 ,p是一级指针
int **p2 = &p; //p2是一级指针p的地址,p2是二级指针
在第一节的例子的基础上,我们继续对二级指针进行图解(可与第一节中的图进行对比)

写在后面:C/C++中的指针是编程的核心知识,使用恰当可提升代码性能,但若使用不当很容易导致程序出现不可预测的行为,需格外小心。C++中指针的进阶 智能指针,可有效避免编程失误导致的一些内存问题,感兴趣的读者可参考本人之前的文章:C++智能指针 解读_c++ 智能指针详解-CSDN博客