C语言指针学习
一、指针基础概念1. 内存、地址、指针、指针变量区分内存程序运行时可访问的存储空间计算机以 1 字节为单位给内存编号。地址内存字节的唯一编号用来定位内存空间。指针 地址指针就是内存编号代表一块内存的位置。指针变量专门存储地址的变量本身也要占用内存空间。2. 指针变量定义语法格式基类型 *变量名;基类型指针指向空间存储的数据类型int/char/float/void 等决定解引用时读取多少字节。*类型标识说明该变量是指针不是普通变量。示例int *pint; // 指向 int 类型的指针 char *pch; // 指向 char 类型的指针 int *pi, *pj; // 同时定义两个 int 指针3. 指针变量占用空间64 位系统所有指针统一占 8 字节32 位系统所有指针统一占 4 字节sizeof(任意指针)只和系统架构有关和指向类型无关。4. 指针初始化与赋值int num 100; int *p NULL; // 初始化为空指针推荐避免野指针 int *p2 num; // 取普通变量地址赋值 p num; // 先定义后赋值NULL等价 0代表指针不指向任何有效内存。野指针未初始化、指向已释放内存、越界地址的指针操作会段错误。规避方案定义时赋值 NULL 或合法变量地址。5. 两大核心运算符 取地址、* 解引用1 取地址运算符作用获取变量首字节地址规则只能对变量取地址不能对常量、表达式、寄存器变量取址。int a; a; // 合法取 a 的地址 100; // 非法2* 解引用间接访问运算符作用通过指针保存的地址访问对应内存里的数据规则*指针等价于基类型变量读写该内存的值。读取字节数由基类型决定char *p*p只操作 1 字节int *p*p操作 4 字节double *p*p操作 8 字节int num 10; int *p num; *p 20; // 等价 num 20; 修改原变量值6. 指针算术运算指针仅支持/--/整数/-整数/指针-指针*/%无意义。指针 ± 整数偏移整数 × sizeof(基类型)字节char *pc; pc1; // 向后偏移 1 字节 int *pi; pi1; // 向后偏移 4 字节指针 1 - 指针 2结果是两个地址之间间隔的元素个数公式元素个数 (地址差值) / sizeof(基类型)前提两个指针指向同一块连续内存数组才有意义。二、指针作为函数参数地址传递核心1. 值传递 vs 地址传递普通值传递实参拷贝一份给形参形参是独立空间无法修改主函数变量指针地址传递实参传变量地址形参指针接收地址*形参直接操作主函数原变量可修改外部变量2. 指针传参三大用途在被调函数修改主调函数的普通变量函数需要返回多个计算结果传递数组避免完整拷贝数组节省内存。3. 二级指针传参场景如果要修改主函数里的指针变量本身不是指针指向的数据需要传指针的地址形参用二级指针接收。void fun(char **pstr) { *pstr new string; // 修改外部一级指针 pstr 的指向 } int main() { char *p hello; fun(p); // 传指针变量的地址二级指针接收 }三、指针与一维数组1. 数组名本质数组名 a 是数组首元素地址常量等价a[0]不能被赋值右值。下标语法和指针语法完全等价a[0] *a; a[1] *(a1); a[n] *(an); a[n] a n;2. 一维数组作函数参数两种写法完全等价// 写法 1数组形式 void print_arr(int a[], int len); // 写法 2指针形式推荐底层理解 void print_arr(int *pa, int len);注意函数内部sizeof(pa)得到的是指针大小8 字节不是数组总长度所以必须手动传长度参数。3. 字符数组 / 字符串指针char str[] hello;str str[0] char *字符串以\0结尾函数传参不需要额外传长度遍历至*str \0停止。自定义字符串库函数mystrlen/mystrcpy 等形参都可用char str[]或char *str。四、数组指针 vs 指针数组极易混淆重点1. 数组指针int (*p)[5]本质指针指向一整个数组括号不能省略()优先级高于[](*p)代表 p 是指针[5]代表指向含 5 个 int 的数组运算特性p1一次性偏移整个数组大小5×420 字节适用场景接收二维数组数组名int a[5] {1, 2, 3, 4, 5}; int (*p)[5] a; // a 是整个数组的地址匹配数组指针类型2. 指针数组int *p[5]本质数组数组里每个元素是int *指针[]优先级高于*先定义数组数组存储指针内存占用64 位系统 5×840 字节典型用途存储多个字符串节省空间// 指针数组存放 5 个字符串常量地址仅存指针不存字符串本体 char *str_arr[5] {aa, bb, cc};3. 指针数组 vs 二维字符数组对比char str1[3][100] {a, b, c}; // 二维数组存储字符串本体总 300 字节 char *str2[3] {a, b, c}; // 指针数组仅存地址总 24 字节二维字符数组开辟连续内存存完整字符串可修改每个字符指针数组仅存字符串常量区地址字符串常量只读不可修改字符。五、指针与二维数组二维数组名 a 是数组指针int (*)[列数]指向第一行一维数组等价a[0]int a[2][3] {1, 2, 3, 4, 5, 6}; a 1; // 跳过一整行3 个 int12 字节二维数组元素访问等价写法a[m][n] *( *(am) n )二维数组传参两种等价写法列数必须指定行数可省略void print2D(int a[][3], int row); void print2D(int (*pa)[3], int row);六、二级指针类型 **p定义保存一级指针变量的地址的指针int num 10; int *p num; int **pp p; // pp 是二级指针存储一级指针 p 的地址两大核心使用场景函数内修改外部一级指针变量前文示例接收指针数组数组名指针数组名 str_arr 等价char **二级指针。char *str[3] {a, b}; void func(char **p); func(str); // 数组名是二级指针直接传参七、指针函数 vs 函数指针区分难点1. 指针函数返回值为指针的函数格式基类型 *函数名(形参)char *get_str() { static char buf[] test; return buf; // 允许返回 static/全局/字符串常量/堆内存地址 // 禁止返回局部栈数组地址函数结束内存销毁变成野指针 }返回地址合法性规则✅ static 静态变量地址 / 全局变量地址 / 字符串常量地址 / 堆 malloc 地址 / 参数传入地址❌ 函数内普通局部变量、局部数组地址2. 函数指针指向函数入口地址的指针格式返回值 (*指针名)(形参列表)// 加法函数 int add(int a, int b) { return a b; } // 定义匹配 add 的函数指针 int (*pfun)(int, int) NULL; pfun add; // 函数名 函数入口地址赋值给函数指针 // 通过指针调用函数 int res pfun(1, 2);核心用途回调函数将函数作为参数传给其他函数解耦代码。八、void* 万能指针定义void *p可以接收任意类型数据的地址通用地址容器限制不能直接解引用*p运算前必须强制转换为对应类型指针典型场景malloc/free、通用工具函数参数。int a 10; void *vp a; int *p (int *)vp; // 强制转换后才能解引用 printf(%d, *p);九、指针核心易错点汇总数组名是地址常量不能a、a pa是数组指针和 a 类型不同sizeof(数组名)只有两种情况代表数组总大小单独sizeof(a)、a作为函数参数时退化为指针野指针、悬空指针不要解引用程序崩溃指针定义默认赋 NULL区分int (*p)[5]数组指针 /int *p[5]指针数组 /int **p二级指针函数返回指针禁止返回栈局部变量地址一级指针传参只能修改指向的数据二级指针才能修改外部指针本身指针算术偏移由基类型字节大小决定不是单纯 ±1 字节字符串常量存在只读段char *p abc;不可写p[0]x字符数组char str[]abc可修改。

相关新闻

AI Agent架构选型实战指南:从需求分析到生产部署

AI Agent架构选型实战指南:从需求分析到生产部署

1. 项目概述:为什么“架构选择”是Agent落地的第一道坎? 最近和几个做AI应用的朋友聊天,发现大家不约而同地卡在了同一个问题上:想法很酷,大模型能力也够用,但真要把一个能自主思考、执行任务的智能体&…

2026/8/8 2:51:03 阅读更多 →
磐图起源:AI智能拍鸟系统实战,从部署到出片全解析

磐图起源:AI智能拍鸟系统实战,从部署到出片全解析

最近在整理手机相册时,发现了一个有趣的现象:拍风景、拍人像的照片,大多都躺在角落里吃灰,唯独那些偶然抓拍到的鸟类照片,每次翻看都让我忍不住嘴角上扬。一只歪头盯着镜头的麻雀,一只在枝头“吵架”的喜鹊…

2026/8/7 19:35:39 阅读更多 →
Android性能优化:adb shell CPU核监控命令实战指南

Android性能优化:adb shell CPU核监控命令实战指南

1. 从一次性能排查说起:为什么需要关注CPU核那天下午,测试同事抱着一台测试机过来,眉头紧锁:“这个App在后台跑着跑着,手机就烫得不行,前台操作也卡顿,你看看是不是哪里死循环了?” …

2026/8/6 3:51:30 阅读更多 →

最新新闻

Web认证机制:Cookie、Session与Token技术解析

Web认证机制:Cookie、Session与Token技术解析

1. 认证机制基础概念解析 在Web开发领域,认证机制是保障系统安全的第一道防线。每次你在网站上点击"记住我"复选框时,背后都是认证机制在发挥作用。目前主流的三种认证方式各有特点: Cookie像是服务员给你的会员卡 - 存放在你的钱…

2026/8/8 3:09:08 阅读更多 →
从零构建Python Web Fuzzer:实现灵活高效的自动化安全测试

从零构建Python Web Fuzzer:实现灵活高效的自动化安全测试

1. 项目概述:为什么我们需要自己的Web Fuzzer? 如果你做过Web安全测试或者渗透测试,Burp Suite的Intruder模块肯定是你工具箱里的常客。它功能强大,界面直观,点几下鼠标就能发起海量请求,对参数进行暴力猜解…

2026/8/8 3:09:08 阅读更多 →
Linux生产消费模型实战:从线程同步到性能优化

Linux生产消费模型实战:从线程同步到性能优化

1. 生产消费模型的核心价值与挑战在Linux系统编程中,生产消费模型堪称并发编程的"Hello World",但它的实际价值远不止教学示例那么简单。这个经典模型本质上解决的是有限资源池场景下的任务调度问题——想象一下快递仓库的分拣流水线&#xff…

2026/8/8 3:09:08 阅读更多 →
Anaconda环境管理与Python开发:从虚拟环境到项目部署全攻略

Anaconda环境管理与Python开发:从虚拟环境到项目部署全攻略

1. 为什么你需要Anaconda,而不仅仅是Python?如果你刚开始接触Python,或者已经写了一些脚本,可能会觉得直接去Python官网下载一个安装包就万事大吉了。但很快,你就会遇到一些让人头疼的“环境问题”。比如,项…

2026/8/8 3:09:08 阅读更多 →
计算机毕业设计之基于Spring Boot的绕绕音乐播放器设计与实现

计算机毕业设计之基于Spring Boot的绕绕音乐播放器设计与实现

如今,在科学技术飞速发展的情况下,信息化的时代也已因为计算机的出现而来临,信息化也已经影响到了社会上的各个方面。它可以为人们提供许多便利之处,可以大大提高人们的工作效率。随着计算机技术的发展的普及,各个领域…

2026/8/8 3:09:08 阅读更多 →
PowerShell入门指南:从执行策略到自动化实战

PowerShell入门指南:从执行策略到自动化实战

1. 从“黑窗口”到“瑞士军刀”:为什么你需要重新认识PowerShell如果你对Windows操作系统的印象还停留在那个黑底白字的“命令提示符”(CMD),觉得它只能敲几个dir、copy、ping的命令,那今天这篇内容可能会彻底改变你的…

2026/8/8 3:08:08 阅读更多 →

日新闻

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

当下AI应用飞速普及,无数企业下场搭建智能体系统,可落地阶段难题接踵而至:上下文无限堆积频繁爆栈、AI工具调用准确率低下、Token成本居高不下、企业数据权限混乱暗藏安全隐患……很多团队卡在架构搭建环节,空有前沿技术概念&…

2026/8/8 0:00:07 阅读更多 →
PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码 【免费下载链接】php-qrcode A PHP QR Code generator and reader with a user-friendly API. 项目地址: https://gitcode.com/gh_mirrors/ph/php-qrcode 在当今数字时代,二维码已…

2026/8/8 0:00:08 阅读更多 →
UniApp微信小程序隐私保护组件开发:从原理到实战

UniApp微信小程序隐私保护组件开发:从原理到实战

1. 项目缘起:为什么我们需要一个隐私保护通用组件?最近在维护一个基于uniapp开发的微信小程序矩阵时,我遇到了一个非常棘手的问题。随着平台对用户隐私保护的要求越来越严格,几乎每一个新版本发布,或者在某些特定机型&…

2026/8/8 0:00:08 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/7 23:24:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/7 17:02:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/7 23:54:54 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/7 17:02:36 阅读更多 →