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

相关推荐
蜗牛一步步往上爬1 小时前
第十六章 C++语言在深度学习中的应用
开发语言·c++·深度学习
张张123y3 小时前
DSH 插件调试避坑:client.js 设置面板、热重载与高频报错排查表
开发语言·javascript·人工智能·开源·ecmascript·后端开发·ai agent
Navigator_Z4 小时前
LeetCode //C - 1317. Convert Integer to the Sum of Two No-Zero Integers
c语言·算法·leetcode
wo_jack5 小时前
C++ 入门笔记(十六):第16课 vector 模拟实现十问十答 —— 从三指针到迭代器失效
c++·后端·面试·stl·vector
D e re k ZH5 小时前
C++ 标准库算法全景指南
数据结构·c++·算法
冻柠檬飞冰走茶6 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
FRing036 小时前
vue2干货总结7(自定义指令、插槽、单页应用程序、路由的使用(VueRouter))
开发语言·前端·vue.js·vue2
雪落漂泊6 小时前
C++算法 二分查找篇(上)
开发语言·c++·算法
波力海苔夹心脆6757 小时前
C# WPF 资源字典详解:ResourceDictionary、MergedDictionaries 与自定义控件案例
开发语言·c#·wpf·入门教程·resource·资源字典
不会算法的笨小孩8 小时前
异常的使用以及会出现的问题
开发语言·c++·c++11·异常