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博客

相关推荐
是一个Bug2 小时前
如何阅读JDK源码?
java·开发语言
石头dhf2 小时前
大模型配置
开发语言·python
冉佳驹2 小时前
C++ ——— 仿函数的使用、继承方式、赋值转换规则、菱形继承与虚继承
c++·继承·virtual·仿函数·菱形继承·模板特化·虚继承
inferno2 小时前
JavaScript 基础
开发语言·前端·javascript
没有bug.的程序员2 小时前
熔断、降级、限流:高可用架构的三道防线
java·网络·jvm·微服务·架构·熔断·服务注册
派大鑫wink2 小时前
【Day15】集合框架(三):Map 接口(HashMap 底层原理 + 实战)
java·开发语言
派大鑫wink2 小时前
【Day14】集合框架(二):Set 接口(HashSet、TreeSet)去重与排序
java·开发语言
咔咔咔的3 小时前
955. 删列造序 II
c++
sort浅忆3 小时前
deeptest执行接口脚本,添加python脚本断言
开发语言·python