C语言指针学习的第一天
指针是C语言的灵魂也是其最强大、最灵活的特性之一。理解指针是掌握C语言编程的关键一步。本文将带你系统性地学习指针从基础概念到高级应用助你彻底征服这个“C语言最难的部分”。一、指针的重要性与功能1. 为什么需要指针指针之所以成为C语言的核心主要因为它提供了以下不可替代的能力直接内存操作指针允许程序直接访问和操作计算机的物理内存地址这是许多底层系统编程如操作系统、驱动程序的基础。高效的数据传递传递指针地址而非整个数据副本极大提升了函数调用和数据处理的效率尤其在处理大型结构体或数组时。动态内存管理通过指针程序可以在运行时动态地申请和释放内存malloc,free实现灵活的数据结构如链表、树。实现复杂数据结构指针是构建链表、二叉树、图等动态数据结构的基础。函数回调与多态通过函数指针可以实现回调机制和一定程度的运行时多态。2. 指针带来的优势代码更加简洁高效避免不必要的数据拷贝提升程序性能。可以直接操作内存空间实现对硬件、操作系统接口的直接交互。二、指针基础概念1. 地址 (Address)计算机内存被划分为无数个连续的字节Byte单元。为了精确找到每个字节系统为每个字节分配一个唯一的编号这个编号就是内存地址。内存寻址范围在64位系统中内存地址空间极大理论上从0x0000000000000000到0xFFFFFFFFFFFFFFFF。地址的本质一个无符号的整数值通常用十六进制表示如0x7ffeebd29a8c。2. 指针 (Pointer)地址等价于指针指针等价于地址。指针就是内存地址的另一种称呼。但指针比单纯的地址多了一个关键属性类型。指针的类型决定了通过这个指针访问内存时一次读写操作所涉及的内存字节大小以及对数据的解释方式。例如一个int *类型的指针告诉编译器“我指向的内存区域存放的是一个int型数据”。当解引用该指针时编译器知道要读取4个字节假设int为4字节并按整数格式解释。3. 指针变量专门用来存放内存地址的变量日常交流中简称为“指针”。intnum10;int*p;// p 是一个指针变量用于存放一个int类型变量的地址pnum;// 将变量num的地址存入指针变量p中三、指针的两个核心运算符1.取地址运算符 (Address-of Operator)作用获取一个变量的内存首地址。操作对象只能是左值即可以出现在赋值号左边的实体如变量。常量如5或表达式如ab不能取地址。类型升级变量的结果类型是“指向该变量类型的指针”。例如numnum为int的类型是int *。intnum0;int*p_numnum;// 获取num的内存首地址并赋值给指针变量p_numprintf(变量num的地址是%p\n,(void*)num);2.*取值运算符/解引用运算符 (Dereference Operator)作用取出指针所指向的内存地址中存储的数据。操作对象只能用于指针类型。类型降级*指针的结果类型是指针所指向的类型。例如*p_nump_num为int *的类型是int。可作为左值*指针不仅可以读取值还可以被赋值从而修改其指向的内存内容。intnum0;int*pnum;*p100;// 通过解引用将num的值修改为100printf(num %d\n,num);// 输出num 100printf(*p %d\n,*p);// 输出*p 100四、指针变量的定义与特性1. 定义语法数据类型 *变量名;int*p;// 定义一个指向int类型的指针变量pchar*ch_p;// 定义一个指向char类型的指针变量ch_pfloat*f_p;// 定义一个指向float类型的指针变量f_pdouble*d_p;// 定义一个指向double类型的指针变量d_p// 同时定义多个指针变量每个变量前都需要*int*p1,*p2,*p3;// p1, p2, p3 都是 int * 类型int*p,q;// p 是 int * 类型q 是 int 类型注意区别2. 指针变量的大小所有指针变量在当前系统中占用的内存大小是相同的与其指向的数据类型无关。这个大小由系统的寻址能力决定32位系统指针通常为4字节。64位系统指针通常为8字节。printf(sizeof(int*) %zu\n,sizeof(int*));// 输出 8 (64位系统)printf(sizeof(char*) %zu\n,sizeof(char*));// 输出 8printf(sizeof(void*) %zu\n,sizeof(void*));// 输出 83. 特殊指针a) 野指针 (Wild Pointer)指向不可知或已无效内存区域的指针。成因指针变量未初始化。指针指向的内存已被释放free但指针未置空。危害访问野指针指向的内存是未定义行为可能导致程序崩溃、数据损坏或安全漏洞。预防定义指针时立即初始化为NULL。b) 空指针 NULL一个特殊的指针值表示“不指向任何对象”。在C语言中通常用宏NULL定义其值为0地址0x0。特性0x0地址通常受操作系统保护不允许读写。解引用空指针会导致程序崩溃段错误。用途作为指针的初始值或用于判断指针是否有效。int*pNULL;// 良好的初始化习惯if(p!NULL){*p10;// 安全操作}else{printf(指针为空不能解引用\n);}五、指针类型与操作含义指针定义含义int *p指针p指向一块用于存放int类型数据的内存空间。char *p指针p指向一块用于存放char类型数据的内存空间。float *p指针p指向一块用于存放float类型数据的内存空间。double *p指针p指向一块用于存放double类型数据的内存空间。核心区分两个操作操作指针本身 (p)修改的是指针变量里存储的地址值。inta1,b2;int*pa;pb;// 操作指针本身让p改为指向变量b操作指针指向的内存 (*p)修改的是指针所指向的内存空间里存储的数据值。inta1;int*pa;*p99;// 操作指向的内存将变量a的值改为99六、指针的算术运算指针的加减运算以所指向类型的大小为基本单位进行移动。/--(自增/自减)指针向高/低地址方向移动**一个“元素”**的距离。intarr[3]{10,20,30};int*parr;// p 指向 arr[0]p;// p 现在指向 arr[1] (地址增加了 sizeof(int) 字节)printf(%d\n,*p);// 输出 20 n/- n指针向前或向后移动 n 个元素。int*parr;int*qp2;// q 指向 arr[2]printf(%d\n,*q);// 输出 30*p运算符优先级后缀优先级高于*。*p等价于*(p)即先取p当前指向的值再将p向后移动一个元素。intarr[]{1,2,3};int*parr;intvalue*p;// value 1, 然后 p 指向 arr[1]指针相减两个同类型指针相减结果是它们之间相隔的元素个数而不是字节数。intarr[10];int*parr[2];int*qarr[8];ptrdiff_tdiffq-p;// diff 6 (中间相隔6个int元素)七、指针基础操作示例#includestdio.hintmain(){inta100;intb200;int*pa;// p 指向 aint*qb;// q 指向 bprintf(初始状态: a%d, b%d, *p%d, *q%d\n,a,b,*p,*q);// 1. 修改指针存储的地址让 p 指向 bpb;printf(操作1 (pb)后: *p%d (现在是b的值)\n,*p);// 2. 指针赋值将 q 中存储的地址拷贝给 p (两者现在都指向b)pq;// 等价于 p b;printf(操作2 (pq)后: *p%d, *q%d\n,*p,*q);// 3. 给 p 指向的空间赋值 (即修改 b 的值)*p999;printf(操作3 (*p999)后: b%d, *p%d, *q%d\n,b,*p,*q);// 4. 将 q 指向的值拷贝到 p 指向的空间 (本例中p和q指向同一处无变化)// 假设我们让p重新指向apa;*p*q;// 将 b 的值(999) 赋给 aprintf(操作4 (*p*q)后: a%d, b%d\n,a,b);return0;}八、指针作为函数参数1. 值传递 (Pass by Value)函数接收参数的一份拷贝。函数内部对形参的修改不会影响外部的实参。voidswap_by_value(intx,inty){inttempx;xy;ytemp;}intmain(){inta5,b10;swap_by_value(a,b);printf(a%d, b%d\n,a,b);// 输出 a5, b10未交换}2. 地址传递/指针传递 (Pass by Pointer/Address)将变量的地址传入函数。函数通过指针地址直接操作原始变量。优势允许函数修改外部多个变量实现“多返回值”效果。本质传递的仍然是值地址值但由于获得了地址从而获得了修改该地址处数据的“权限”。voidswap_by_pointer(int*px,int*py){inttemp*px;// 解引用获取px指向的值(a)*px*py;// 将py指向的值(b)赋给px指向的内存(a)*pytemp;// 将temp赋给py指向的内存(b)}intmain(){inta5,b10;swap_by_pointer(a,b);// 传入地址printf(a%d, b%d\n,a,b);// 输出 a10, b5成功交换}九、一维数组与指针的关系在C语言中数组名在大多数情况下会被编译器转换为指向其首元素的指针常量。intarr[5]{1,2,3,4,5};int*parr;// 等价于 int *p arr[0];核心等价关系对于数组访问arr[n]以下四种写法完全等价arr[n]// 数组下标法*(arr n)// 指针算术解引用法*(p n)// 通过指针变量p[n]// 指针下标法printf(%d\n,arr[2]);// 3printf(%d\n,*(arr2));// 3printf(%d\n,*(p2));// 3printf(%d\n,p[2]);// 3重要注意事项数组名是指针常量arr的值首地址不能改变arr some_other_var;是错误的。两个例外数组名不代表指针sizeof(arr)返回的是整个数组占用的字节大小如5 * sizeof(int)而不是指针大小。arr得到的是“指向整个数组的指针”其类型是int (*)[5]与int *不同。arr 1会跳过整个数组。十、一维数组作为函数参数当数组作为函数参数传递时它退化为指向其首元素的指针。因此以下三种函数声明是等价的// 写法1数组形式最直观但长度信息已丢失voidprintArray(intarray[],intlen){for(inti0;ilen;i)printf(%d ,array[i]);}// 写法2指定数组容量编译器忽略无实际约束作用voidprintArray(intarray[5],intlen){// 这里的5会被忽略for(inti0;ilen;i)printf(%d ,array[i]);}// 写法3标准指针形式最本质推荐voidprintArray(int*parray,intlen){for(inti0;ilen;i)printf(%d ,parray[i]);// 仍可用下标}调用方式intmain(){intmyArr[5]{1,2,3,4,5};printArray(myArr,5);// 传递数组名即首地址return0;}关键点函数内对数组元素的修改如parray[i] 10;会直接作用于外部的原始数组因为操作的是同一块内存。总结指针是C语言赋予程序员的“内存地图”和“遥控器”。初学可能感到畏惧但理解其“地址-类型-解引用”的核心逻辑后便能体会到其带来的强大控制力与效率。掌握指针是迈向C语言高手之路的必经关卡。后续我们将深入探讨指针与字符串、多级指针、指针数组、动态内存分配等高级主题。练习建议多写代码使用调试器观察指针变量的地址和值的变化画出内存示意图是理解指针最有效的方法。

相关新闻

iOS工具类应用开发到上架苹果商店全流程详解(含国内开发者账号注意事项)

iOS工具类应用开发到上架苹果商店全流程详解(含国内开发者账号注意事项)

一、前言:为什么需要了解完整上架流程? 对于iOS开发者而言,将一个工具类应用从构思变为App Store上可下载的产品,是一条充满技术细节和规则约束的道路。不同于简单的Demo开发,正式上架涉及代码规范、证书配置、审核政…

2026/8/1 5:22:48 阅读更多 →
代理记账/财税公司如何利用AI Agent进行GEO运营:知识库搭建×内容创作×效果监测的完整实操手册

代理记账/财税公司如何利用AI Agent进行GEO运营:知识库搭建×内容创作×效果监测的完整实操手册

2026年,一个创业者在上海注册了一家公司。第二天,他打开豆包,打了一行字:”上海代理记账多少钱?”豆包回答:”目前市场上小规模纳税人代理记账月费约200-500元,一般纳税人约500-1500元&#xff…

2026/8/1 5:22:48 阅读更多 →
KNN算法详解:从原理到实战应用

KNN算法详解:从原理到实战应用

1. 什么是KNN算法? KNN(K-Nearest Neighbors,K最近邻)算法是一种经典的监督学习算法,既可以用于分类任务,也可以用于回归任务。它基于一个非常直观的思想:相似的事物在特征空间中距离相近。 1.1…

2026/8/1 5:22:48 阅读更多 →

最新新闻

多项式除法算法实现:从数学原理到C++代码详解

多项式除法算法实现:从数学原理到C++代码详解

1. 多项式除法:从数学概念到算法实现在算法竞赛和计算机科学的学习中,多项式运算是一个绕不开的话题。它不仅是数学分析的基础,更在信号处理、编码理论(如CRC校验)、机器学习(如多项式回归)等领…

2026/8/1 6:55:26 阅读更多 →
QT Release程序崩溃分析:PDB与Dump文件配置实战指南

QT Release程序崩溃分析:PDB与Dump文件配置实战指南

1. 项目概述:为什么你的QT程序需要PDB和Dump文件?如果你是一个用C和QT开发桌面应用的工程师,尤其是负责维护一个已经发布给用户使用的产品,那么下面这个场景你一定不陌生:测试同事或者用户反馈说“程序在某个操作下闪退…

2026/8/1 6:55:26 阅读更多 →
内江楼宇对讲厂家

内江楼宇对讲厂家

在现代城市生活中,楼宇对讲系统已成为保障居民安全、提升居住体验的重要设施。特别是在内江这样的城市,选择一个可靠的楼宇对讲系统厂家至关重要。本文将从几个方面为大家推荐四川鸿门科技,并提供一些实用的建议。1. 产品质量与技术优势数据支…

2026/8/1 6:55:26 阅读更多 →
AI视频虚拟背景“穿帮”事故频发?揭秘光照一致性校准的2个隐式约束条件与1个动态Gamma补偿公式

AI视频虚拟背景“穿帮”事故频发?揭秘光照一致性校准的2个隐式约束条件与1个动态Gamma补偿公式

更多请点击: https://kaifayun.com 第一章:AI视频虚拟背景“穿帮”事故频发?揭秘光照一致性校准的2个隐式约束条件与1个动态Gamma补偿公式 AI虚拟背景在会议、直播等场景中广泛部署,但用户频繁反馈人物边缘泛白、阴影错位、发丝透…

2026/8/1 6:55:26 阅读更多 →
豆包图片创作风格白皮书(2024Q2独家实测数据|覆盖23种主流设计场景)

豆包图片创作风格白皮书(2024Q2独家实测数据|覆盖23种主流设计场景)

更多请点击: https://intelliparadigm.com 第一章:豆包图片创作风格概览与核心定位 豆包(Doubao)作为字节跳动推出的多功能AI助手,其图片创作能力并非以通用图像生成模型(如Stable Diffusion或DALLE&#…

2026/8/1 6:55:25 阅读更多 →
多模态多目标进化算法在机器人路径规划中的应用

多模态多目标进化算法在机器人路径规划中的应用

1. 项目概述移动机器人路径规划是机器人学领域的核心问题之一,其目标是在复杂环境中为机器人寻找一条从起点到终点的最优或近似最优路径。传统方法如A*、Dijkstra等算法虽然成熟,但在处理多目标优化问题时往往力不从心。这正是多模态多目标进化算法&…

2026/8/1 6:54:25 阅读更多 →

日新闻

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

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

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

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

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

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

2026/8/1 0:00:48 阅读更多 →
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/1 0:00:48 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/8/1 5:19:34 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/31 4:19:39 阅读更多 →

月新闻

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

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

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

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

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

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

2026/8/1 0:00:48 阅读更多 →
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/1 0:00:48 阅读更多 →