C语言 指针用法与区别(指针常量、常量指针、指针函数、函数指针、二级指针)

前言:指针是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;  // 返回变量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博客

相关推荐
福大大架构师每日一题10 小时前
ComfyUI v0.11.1正式发布:新增开发者专属节点支持、API节点强化、Python 3.14兼容性更新等全方位优化!
开发语言·python
wangdaoyin201010 小时前
若依vue2前后端分离集成flowable
开发语言·前端·javascript
John_ToDebug10 小时前
浏览器内核崩溃深度分析:从 MiniDump 堆栈到 BindOnce UAF 机制(未完待续...)
c++·chrome·windows
向阳开的夏天11 小时前
麒麟V10源码编译QT5.6.3 (x86 & arm64)
开发语言·qt
想放学的刺客11 小时前
单片机嵌入式试题(第29期)嵌入式系统的电源完整性设计与去耦电容选型。抗干扰设计与EMC合规性
c语言·stm32·嵌入式硬件·物联网·51单片机
Evand J11 小时前
【MATLAB例程】TOA和TDOA混合定位,适用于二维平面的高精度定位。锚点数量、位置、测量噪声可自行调节
开发语言·matlab·定位·tdoa
念越11 小时前
数据结构:栈堆
java·开发语言·数据结构
txinyu的博客11 小时前
解析muduo源码之 SocketsOps.h & SocketsOps.cc
c++
淮北49412 小时前
pip虚拟环境包的问题
开发语言·python·pip
dear_bi_MyOnly12 小时前
【多线程——线程状态与安全】
java·开发语言·数据结构·后端·中间件·java-ee·intellij-idea