C语言基础(八)指针相关内容
C语言指针引言指针是C语言的核心机制之一也是其区别于多数高级语言的关键特性。指针本质上是对内存地址的抽象它提供了直接操作内存的能力使得C语言能够实现高效的系统编程、硬件控制和动态内存管理。本文基于C语言标准系统阐述指针的语法、语义及典型应用场景涵盖从基础定义到函数指针的完整知识体系。一、指针基础1.1 内存、地址与指针的概念计算机内存以字节为单位进行编址每个字节对应一个唯一的数值标识即地址。程序运行时变量被分配在内存的特定位置其起始地址称为该变量的首地址。指针即地址本身而指针变量是用于存储地址的变量其自身也占用内存空间在64位系统中通常为8字节32位系统中为4字节。1.2 指针变量的定义指针变量的定义语法如下基类型*变量名;基类型指明该指针所指向内存单元中存储的数据类型可以是基本数据类型int、char、float、double、构造数据类型或void。*类型说明符表示定义的是指针变量。变量名遵循标识符命名规则通常以p或ptr为前缀以增强可读性。示例int*pint;// 指向int型数据的指针char*pch;// 指向char型数据的指针double*pd;// 指向double型数据的指针指针变量中存储的是其所指向数据的首地址。1.3 指针变量的初始化与赋值指针变量必须在使用前被明确赋值否则其值为随机野指针可能导致不可预料的错误。推荐初始化为NULL即0或已有变量的地址。intnum10;int*pNULL;// 初始化为空指针pnum;// 赋值获取num的地址野指针是指未初始化、已释放或指向无效内存的指针。避免野指针的核心原则定义时初始化为NULL仅将指针指向合法且生命周期可控的变量释放动态内存后将指针置为NULL。1.4 指针运算符取地址运算符获取变量的首地址。只能作用于变量不能用于常量或表达式。间接访问运算符*解引用访问指针所指向的内存单元中的数据。解引用所访问的字节数由指针的基类型决定例如char *解引用访问1字节int *访问4字节。inta5;int*paa;*pa10;// 等价于 a 10;1.5 指针的算术运算指针支持有限的算术运算主要包括自增、自减--、加/减整数pn、p-n以及指针相减仅当指向同一数组时有效。运算的步长由基类型大小决定即p1的地址偏移量为sizeof(基类型)字节。intarr[5]{1,2,3,4,5};int*parr;// 指向arr[0]p;// 现在指向arr[1]地址增加4字节int为4字节指针相减的结果为元素个数差类型为ptrdiff_t有符号整数。二、指针与一维数组2.1 数组名的指针语义在C语言中数组名在绝大多数表达式中被解释为数组首元素的地址即arr等价于arr[0]其类型为基类型 *。例如inta[10];int*pa;// 合法a为int*类型2.2 通过指针访问数组元素利用指针算术和间接访问可以遍历数组for(inti0;i10;i){*(pi)i;// 等价于 a[i] i;}a[i]本质上被编译器转换为*(ai)故指针和数组下标在访问层面等效。2.3 数组作为函数参数当数组作为函数参数传递时实际传递的是首元素的地址形参退化为指针。因此以下两种函数原型等价voidprint_array(intarr[],intlen);voidprint_array(int*arr,intlen);在被调函数中sizeof(arr)获得的是指针本身的大小8字节而非数组总字节数故必须显式传递数组长度。三、指针与一维字符型数组字符型数组C风格字符串以\0作为结束标志。数组名同样退化为字符指针指向字符串首字符。charstr[32]hello;char*pstr;// 等价于 char *p str[0];遍历字符串可通过指针递增直至遇到\0intmystrlen(constchar*s){intlen0;while(*s)len;returnlen;}由于字符串自带终止符函数传参时无需额外传递长度仅需传入指针即可。四、数组指针指向数组的指针数组指针是指向整个数组的指针其定义语法为基类型(*指针名)[数组长度];例如int (*p)[5]定义了一个指针可以指向具有5个int元素的数组。它与普通指针的关键区别在于步长p1将偏移整个数组的大小5 * sizeof(int)。inta[5]{1,2,3,4,5};int(*pa)[5]a;// pa指向数组整体注意以下区别a数组名类型为int *指向首元素a类型为int (*)[5]指向整个数组。数组指针通常用于操作二维数组的行。五、指针与二维数组5.1 二维数组名的指针类型二维数组int a[2][3]的数组名a在表达式中被解释为首元素即第一行一维数组的地址其类型为int (*)[3]即一个数组指针步长为3 * sizeof(int)。5.2 指针访问二维数组元素借助数组指针和偏移可以访问任意元素inta[2][3]{{1,2,3},{4,5,6}};int(*p)[3]a;// p指向第一行intval*(*(p1)2);// 访问a[1][2]值为6通用公式a[i][j]等价于*(*(ai) j)。5.3 二维数组作为函数参数形参可声明为二维数组形式行数可省略列数不可省略或等价的数组指针形式voidprint_2D(intarr[][3],introws);voidprint_2D(int(*arr)[3],introws);// 完全等价调用时传递数组名及行数即可。六、指针数组保存指针的数组指针数组本质是数组其元素均为指针类型。定义语法基类型*数组名[元素个数];例如char *str_arr[5]定义了一个包含5个字符指针的数组每个指针可指向一个字符串常量或字符数组。初始化char*p[3]{hello,world,how};此时p[0]存储字符串常量hello的首地址p[1]存储world的首地址依此类推。指针数组常用于处理多个字符串每个字符串的长度可不同且各元素可独立重新指向。指针数组与二维字符数组的区别特性二维字符数组指针数组存储内容字符串数据本身占全部空间字符串的地址内存分配固定行列浪费或不足灵活各指针独立指向修改内容可修改字符串内容可改变指针指向但字符串常量不可修改典型用途存储固定数量、固定长度的字符串操作多个动态字符串或常量串七、二级指针指向指针的指针二级指针是存储指针变量的地址的指针。定义语法基类型**变量名;例如int **pp表示指向int *类型变量的指针。7.1 主要应用场景在函数中修改主调函数的指针变量若需在被调函数中改变主调函数中指针的指向需传递该指针的地址形参用二级指针接收。voidset_pointer(int**pp,int*new_val){*ppnew_val;// 修改主调中的指针}调用set_pointer(p, some_var);指针数组的数组名char *p_arr[3]在表达式中退化为char **类型可传递给期望二级指针的函数用于遍历或操作指针数组。voidprint_strs(char**arr,intn){for(inti0;in;i){puts(arr[i]);// arr[i]为char*}}八、指针函数返回指针的函数指针函数是指返回值为指针类型的函数。定义时需将*与函数名结合基类型*函数名(形参表);例如char *strcpy(char *dest, const char *src);返回char *。8.1 合法返回的指针类型静态变量或全局变量的地址具有静态生命周期程序结束时才释放。字符串常量地址位于只读数据段生命周期贯穿程序。通过参数传入的地址可直接返回该地址如strcpy返回目标地址。堆区动态分配的内存通过malloc等前提是未释放。8.2 禁止返回局部变量的地址局部变量包括局部数组在函数返回后其栈帧被销毁返回其地址将导致悬垂指针访问未定义行为。int*bad_func(){intx10;returnx;// 错误}九、函数指针指向函数的指针9.1 定义与赋值函数名代表函数的入口地址。函数指针的定义需指定返回类型和参数类型列表返回值类型(*指针名)(参数类型列表);例如int (*pfun)(int, int);定义了一个可指向返回int、接受两个int参数的函数的指针。赋值intadd(inta,intb){returnab;}pfunadd;// 或 pfun add;9.2 调用通过函数指针调用函数可直接使用指针名或解引用加实参intresultpfun(3,4);// 等价于 add(3,4)9.3 回调函数回调函数是将函数指针作为参数传递给另一函数使得被调函数能够在适当时候调用该函数。回调机制广泛应用于事件驱动、排序算法如qsort的比较函数和框架设计中其核心优势在于解耦调用者与具体实现提高代码复用性和灵活性。示例简化版排序比较intcompare_int(constvoid*a,constvoid*b){return(*(int*)a-*(int*)b);}voidsort(void*base,intn,intsize,int(*cmp)(constvoid*,constvoid*));调用时传递compare_int作为回调。十、总结指针是C语言的精髓其核心思想可归纳为指针即地址指针变量存储地址通过基类型决定访问宽度。数组名在表达式中退化为指针函数参数传递数组时实际传递指针。数组指针、指针数组、二级指针各具用途分别用于指向数组整体、存储指针集合、修改指针变量。指针函数与函数指针需严格区分前者返回指针后者指向函数。指针与数组、字符串、函数、动态内存管理紧密关联掌握指针是深入理解C语言内存模型和系统编程的基础。正确使用指针能够显著提升程序效率但不当使用如野指针、越界访问将导致严重错误。开发者应始终遵循“初始化、检查边界、避免悬垂”的原则并善用const修饰符增强安全性与可读性。

相关新闻

2026学术写作AI论文写作工具全榜单:7款实测,谁是论文党的真效率工具?

2026学术写作AI论文写作工具全榜单:7款实测,谁是论文党的真效率工具?

在 AI 持续渗透学术创作流程的 2026 年,学术写作工具的能力边界已经不再局限于内容生成,而是逐步延伸到结构梳理、格式规范、可视化表达、语言润色与答辩整理等多个关键环节。对于本科生、研究生以及需要持续输出论文与课题材料的研究者而言,…

2026/8/6 5:18:11 阅读更多 →
ai免费写论文好用吗?实测3款AI论文软件,结果有高有低!

ai免费写论文好用吗?实测3款AI论文软件,结果有高有低!

宝子们,有没有人跟我一样,一提到写论文就头皮发麻? 熬夜熬到凌晨三点,结果导师一句"逻辑不通"打回重写,谁懂啊! 说真的,我之前也以为 AI 写论文是智商税,直到自己踩了无数…

2026/8/6 5:18:11 阅读更多 →
从MSSQL到域控:HTB Escape靶机渗透实战与AD域横向移动详解

从MSSQL到域控:HTB Escape靶机渗透实战与AD域横向移动详解

1. 项目概述与核心挑战最近在HackTheBox平台上挑战了一个名为“Escape”的Windows靶机,评级为Medium。这个靶机给我留下了深刻的印象,它不像那些简单的“拿shell、提权”两步走机器,而是构建了一个相当贴近真实企业环境的场景。整个渗透路径涉…

2026/8/7 8:02:52 阅读更多 →

最新新闻

Unity游戏本地化实战:XUnity.AutoTranslator插件全流程指南

Unity游戏本地化实战:XUnity.AutoTranslator插件全流程指南

1. 项目概述:为什么游戏本地化是独立开发者的必修课?如果你是一名独立游戏开发者,或者是一个小型工作室的成员,当你的游戏在Steam、itch.io或移动端商店获得第一个海外玩家的好评时,那种兴奋感是无与伦比的。但紧接着&…

2026/8/7 8:02:36 阅读更多 →
STM32G431多通道ADC电压采集:DMA方式实现与优化

STM32G431多通道ADC电压采集:DMA方式实现与优化

1. 项目缘起:为什么是STM32G431与DMA方式的ADC?在嵌入式开发里,采集模拟信号是再基础不过的操作。但就是这个基础操作,选型和方法的不同,带来的开发体验和最终性能天差地别。我最近在一个需要同时监控多路传感器电压的…

2026/8/7 8:02:36 阅读更多 →
Unity中文路径导致插件导入失败:高精地图绘制避坑指南

Unity中文路径导致插件导入失败:高精地图绘制避坑指南

1. 项目概述:当Unity遇上中文路径,一个看似简单的“坑”如何让高精地图绘制前功尽弃如果你正在为自动驾驶项目折腾Autoware的高精地图,并且选择了Unity配合MapToolBox插件这条技术路线,那么恭喜你,你已经踏入了自动驾驶…

2026/8/7 8:02:36 阅读更多 →
基于@Tool与MCP协议构建企业级AI Agent工具体系

基于@Tool与MCP协议构建企业级AI Agent工具体系

1. 项目概述:为什么我们需要一个企业级的Agent工具体系?最近和几个技术团队负责人聊天,大家不约而同地提到了同一个痛点:AI Agent(智能体)的概念很火,团队也尝试用LangChain、AutoGPT之类的框架…

2026/8/7 8:02:36 阅读更多 →
实习日记一:打包程序,自己安装MySQL+彻底卸载MySQL

实习日记一:打包程序,自己安装MySQL+彻底卸载MySQL

一、概述mysql 数据库 常用版本 5.6、5.7、8.0检查电脑的 mysql 环境 ------------ 看服务列表里的 mysql 服务能不能正常启动安装方式:2 种 1.傻瓜式安装:点下一步的形式 2.打包程序,全程自己完成字符编码:utf8、GBK、ISO‑8859‑…

2026/8/7 8:02:36 阅读更多 →
【RK3568 linux-6.6内核ttyS9只能收不能发送问题】

【RK3568 linux-6.6内核ttyS9只能收不能发送问题】

矿鸿1.3版本,rk3568使用linux-6.6内核驱动 1.问题描述 板卡启动成功,ttyS7正常收发,ttyS9只能收不能发送。 2.问题分析 2.1对比设备树uart7和uart9配置一致 //rs232-7 &uart7 {status "okay";pinctrl-names "default&qu…

2026/8/7 8:01:36 阅读更多 →

日新闻

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 想要将Android手机屏幕完美投射到电脑上,享受大屏操作的自…

2026/8/7 0:00:19 阅读更多 →
如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南 【免费下载链接】tom-select Tom Select is a lightweight (~16kb gzipped) hybrid of a textbox and select box. Forked from selectize.js to provide a framework agnostic autocomplete widget wi…

2026/8/7 0:00:19 阅读更多 →
5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件 【免费下载链接】nsz NSZ - Homebrew compatible NSP/XCI compressor/decompressor 项目地址: https://gitcode.com/gh_mirrors/ns/nsz 你是否在为Nintendo Switch游戏文件占用大量存储…

2026/8/7 0:00:19 阅读更多 →

周新闻

最大流算法详解:从水管网络到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/6 22:02:27 阅读更多 →

月新闻

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

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

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

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

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

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

2026/8/6 22:02:28 阅读更多 →
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/5 23:46:51 阅读更多 →