news 2026/4/23 13:58:32

【C语言篇:指针】 指针全面讲解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【C语言篇:指针】 指针全面讲解

C语言篇:指针全面讲解

指针是C语言的灵魂,也是最容易让人困惑的部分。
掌握指针,就等于掌握了C语言的“内存操控权”和“地址级编程能力”。

下面从零到深入,系统地把指针讲透。

1. 指针到底是什么?

最核心一句话:

指针是一个变量,它的值是另一个变量的内存地址。

inta=10;// a 是一个普通整型变量int*p;// p 是一个指针变量,专门用来存地址p=&a;// 把 a 的地址赋给 p

画图理解:

内存地址 内容 0x7ffee4a0 ←─ a 的地址 │ 10 ←─ a 的值 ↑ p ←─ p 存的是 0x7ffee4a0

所以:

  • &a→ 取a的地址
  • *p→ 解引用(通过地址找到里面的值)
printf("%d\n",a);// 10printf("%d\n",*p);// 10printf("%p\n",&a);// 0x7ffee4a0(地址)printf("%p\n",p);// 0x7ffee4a0(地址)printf("%p\n",&p);// p 自己的地址(指针变量也占内存)

2. 指针的声明方式(非常重要!)

int*p;// p 是一个指向 int 的指针double*q;// q 指向 doublechar*str;// str 指向 char(最常见用于字符串)int**pp;// pp 是一个指向指针的指针(二级指针)int*arr[10];// 指针数组:10个指向int的指针int(*ptr)[10];// 数组指针:指向一个有10个int的数组

最容易写错的几种写法对比:

int*p1,p2;// p1是指针,p2是普通int ← 陷阱!int*p1,p2;// 同上,还是只有p1是指针int*p1,*p2;// 正确,两个都是指针

推荐写法(清晰):

int*p;int*q;

3. 指针最常见的六大使用场景

序号场景典型代码示例核心目的
1修改函数外部变量void swap(int *a, int *b)传址调用,实现“真交换”
2动态内存分配int *p = malloc(n * sizeof(int));运行时决定大小的数组
3操作数组(最经典用法)*(arr + i)等价于arr[i]数组名就是首元素地址
4字符串处理char *s = "hello";char str[]="hi";字符串本质是char指针
5多级指针(链表、树等)struct Node **head修改链表头指针
6函数指针int (*func)(int, int);回调、策略模式、qsort等

4. 指针与数组(最容易混淆的部分)

核心口诀:

  • 数组名在多数情况下会隐式转换为指向首元素的指针
  • 但数组名本身不是指针,它是一个常量地址
intarr[5]={10,20,30,40,50};int*p=arr;// 正确,等价于 &arr[0]int*q=&arr;// 错误!类型不匹配int(*r)[5]=&arr;// 正确,数组指针printf("%p\n",arr);// 首元素地址printf("%p\n",&arr);// 整个数组的地址(数值相同,但类型不同)printf("%zu\n",sizeof(arr));// 20(5×4)printf("%zu\n",sizeof(p));// 4或8(指针大小)

指针运算规则(非常重要):

intarr[5];int*p=arr;p++;// 指向 arr[1],地址 + sizeof(int)p+=2;// 指向 arr[3]*(p+3)=99;// 等价于 arr[6] = 99(越界!危险!)

5. 指针与字符串(经典用法)

// 三种常见写法对比charstr1[]="hello";// 数组,内容可改,大小固定char*str2="hello";// 指针,指向常量区,不可修改内容(C标准中未定义行为)constchar*str3="hello";// 推荐写法:指向字符串常量str1[0]='H';// 可以// str2[0] = 'H'; // 不安全!可能段错误

动态字符串推荐做法:

char*s=malloc(100);strcpy(s,"hello world");...free(s);// 千万别忘!

6. const 与指针(面试高频)

const 修饰的位置不同,含义完全不同:

写法含义谁不能改
const int *p指向的内容不能改(指针常量)*p
int * const p指针本身不能改(常量指针)p
const int * const p指针和内容都不能改p 和 *p
int const *p同 const int *p*p

记忆口诀:const 离谁近,谁就不能改

7. 多级指针(链表修改头节点经典案例)

voidinsert_head(structNode**head,intval){structNode*new_node=malloc(sizeof(structNode));new_node->data=val;new_node->next=*head;*head=new_node;// 修改主函数中的头指针}

调用:

structNode*list=NULL;insert_head(&list,100);// 要传 &list(地址的地址)

8. 函数指针(高级用法)

// 定义一个函数指针类型typedefint(*Operation)(int,int);// 函数实现intadd(inta,intb){returna+b;}intsub(inta,intb){returna-b;}// 使用Operation op=add;printf("%d\n",op(10,3));// 13op=sub;printf("%d\n",op(10,3));// 7

经典应用:qsort、信号处理、回调函数、状态机等。

9. 指针常见错误与防御性写法

错误类型典型代码后果防御写法
野指针int *p; *p = 100;段错误初始化为 NULL
悬空指针free§; *p = 10;未定义行为free后立刻 p = NULL
越界访问int a[5]; a[10] = 1;内存破坏严格控制下标
返回局部变量地址return &local_var;悬空指针不要返回栈上地址
重复freefree§; free§;崩溃free后置NULL,检查是否NULL再free

总结:指针核心思维导图

指针 ├── 概念:存地址的变量 ├── 声明:类型 *变量名 ├── 运算:& 取地址 * 解引用 ++ -- + -(按类型大小移动) ├── 与数组:数组名→首元素地址 指针可当数组用 ├── const位置决定谁不可改 ├── 多级指针:修改指针本身(链表头、函数参数) ├── 函数指针:回调、动态行为 └── 安全原则: • 初始化为NULL • 使用前判空 • free后置空 • 避免返回局部变量地址

一句话总结:

指针就是让你可以直接“隔着地址操作内存”的能力。
它强大、灵活,但也危险。写C程序时,对指针的每一次操作都要心怀敬畏

有哪部分还想再深入(比如链表实现、函数指针数组、void*用法、const正确用法等),可以继续问,我继续给你拆得更细!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 10:45:53

SDXL 1.0电影级绘图工坊实战案例:独立开发者IP形象设计全流程

SDXL 1.0电影级绘图工坊实战案例:独立开发者IP形象设计全流程 你是不是也想过,为自己打造一个独一无二的虚拟形象,用在社交媒体、个人网站或者项目介绍里?找画师定制,价格不菲且沟通耗时;自己动手&#xf…

作者头像 李华
网站建设 2026/4/22 14:33:48

人脸识别OOD模型实战落地:从实验室模型到7×24小时安防产线部署

人脸识别OOD模型实战落地:从实验室模型到724小时安防产线部署 在真实安防场景中,我们常遇到这样的问题:摄像头拍到的人脸模糊、侧脸、反光、过暗或被遮挡,但系统仍强行比对并给出错误结果——这不仅降低识别准确率,更…

作者头像 李华
网站建设 2026/4/23 9:20:03

浦语灵笔2.5-7B数学推理:复杂问题求解过程展示

浦语灵笔2.5-7B数学推理:复杂问题求解过程展示 1. 为什么这个模型的数学推理能力值得关注 最近在测试几个开源大模型时,我特意挑了一道往年国际数学奥林匹克竞赛的几何题,想看看当前主流7B级别模型的实际表现。结果浦语灵笔2.5-7B给出的解答…

作者头像 李华
网站建设 2026/4/23 0:40:09

Local AI MusicGen镜像免配置:Docker一键拉取即用工作台教程

Local AI MusicGen镜像免配置:Docker一键拉取即用工作台教程 1. 为什么你需要一个本地AI作曲工具 你有没有过这样的时刻:正在剪辑一段短视频,突然卡在了配乐上——找版权音乐太费时间,自己不会作曲,外包又太贵&#…

作者头像 李华
网站建设 2026/4/23 12:11:12

Fish Speech 1.5语音合成成本测算:千字语音GPU小时消耗与云成本模型

Fish Speech 1.5语音合成成本测算:千字语音GPU小时消耗与云成本模型 1. 为什么需要真实可算的TTS成本模型? 你有没有遇到过这样的情况: 刚在镜像市场部署好 Fish Speech 1.5,点几下就生成了一段“你好,欢迎使用”的语…

作者头像 李华
网站建设 2026/4/23 13:43:33

Chord模型安全:对抗样本防御实践

Chord模型安全:对抗样本防御实践 1. 为什么Chord需要安全防护 Chord作为一款专注于视频时空理解的本地化分析工具,它的核心价值在于不联网、不传云、所有计算都在用户自己的GPU上完成。这种离线部署模式带来了天然的数据隐私优势,但同时也让…

作者头像 李华