C语言:指针的理解

发布时间:2026/10/22 17:08:59

C语言:指针的理解 深入理解C语言指针1.什么是指针指针是一个变量其值为另一个变量的地址。简单来说指针就是内存地址的别名。通过指针我们可以直接访问和操作内存中的数据。指针的声明在C语言中指针的声明格式如下c数据类型 *指针变量名;例如cint *p; // 声明一个指向int类型变量的指针p这里int *p 表示 p 是一个指向 int 类型变量的指针。2.指针的初始化指针在使用之前必须初始化否则它会指向一个未知的内存地址导致程序出错。指针的初始化可以通过以下两种方式进行1. 直接赋值cint a 10;int *p a; // 将指针p初始化为变量a的地址2. 先声明后赋值cint a 10;int *p;p a; // 将指针p指向变量a的地址3.指针的解引用解引用是指通过指针访问或修改其所指向的内存地址中的值。解引用操作使用 * 符号。cint a 10;int *p a;printf(%d\n, *p); // 输出10*p表示访问p所指向的内存地址中的值*p 20; // 通过指针p修改a的值printf(%d\n, a); // 输出204. 指针的运算指针支持几种基本的算术运算包括加法、减法、比较等。这些运算在数组和字符串操作中非常有用。指针的加减法指针的加减法并不是简单的数值加减而是根据指针所指向的数据类型进行偏移。例如cint arr[5] {1, 2, 3, 4, 5};int *p arr; // p指向数组的第一个元素p; // p现在指向数组的第二个元素printf(%d\n, *p); // 输出2在上面的例子中p 并不是将 p 的值加1而是将 p 的值增加 sizeof(int)即4个字节假设 int 类型占4个字节。5. 指针的比较指针之间可以进行大小比较通常用于判断指针是否指向同一个数组中的元素。cint arr[5] {1, 2, 3, 4, 5};int *p1 arr[0];int *p2 arr[4];if (p1 p2) {printf(p1指向的元素在p2之前\n);}6. 指针与数组在C语言中数组名本质上是一个指向数组第一个元素的指针。因此数组和指针之间有很多相似之处。数组名作为指针cint arr[5] {1, 2, 3, 4, 5};int *p arr; // arr是数组名也是指向数组第一个元素的指针printf(%d\n, *(p 2)); // 输出3相当于arr[2]指针数组指针数组是指数组中的每个元素都是一个指针。例如cint a 1, b 2, c 3;int *arr[3] {a, b, c}; // arr是一个指针数组printf(%d\n, *arr[1]); // 输出27. 指针与函数指针在函数中的应用非常广泛尤其是在传递数组或结构体等复杂数据类型时。指针作为函数参数通过指针作为函数参数可以实现对实参的修改。cvoid swap(int *a, int *b) {int temp *a;*a *b;*b temp;}int main() {int x 10, y 20;swap(x, y);printf(x %d, y %d\n, x, y); // 输出x 20, y 10return 0;}指针作为函数返回值函数可以返回指针但需要注意返回的指针不能指向局部变量因为局部变量在函数结束后会被销毁。cint *getMax(int *a, int *b) {return (*a *b) ? a : b;}int main() {int x 10, y 20;int *max getMax(x, y);printf(Max value is %d\n, *max); // 输出20return 0;}8. 指针的高级用法指针的指针指针的指针是指一个指针变量存储的是另一个指针变量的地址。例如cint a 10;int *p a;int **pp p; // pp是一个指向指针p的指针printf(%d\n, **pp); // 输出10函数指针函数指针是指向函数的指针变量。通过函数指针可以实现回调函数等高级功能。cint add(int a, int b) {return a b;}int main() {int (*funcPtr)(int, int) add; // funcPtr是一个指向add函数的指针printf(%d\n, funcPtr(2, 3)); // 输出5return 0;}9. 常见问题与注意事项1.野指针指针未初始化或指向已释放的内存区域导致程序崩溃或不可预知的行为。2.内存泄漏动态分配的内存未释放导致内存浪费。3.指针越界访问数组或内存区域外的地址导致程序崩溃。10.总结指针是C语言中最强大的工具之一掌握指针的使用对于编写高效、灵活的C语言程序至关重要。希望通过本文的讲解读者能够对C语言指针有更深入的理解并在实际编程中灵活运用。下一篇博客小楊将会为大家讲解一下陷阱指针--野指针
延伸阅读

更多相关文章

2026/10/22 17:08:59

JAVA:基本数据类型详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/22 17:03:55

PJ85718DM+PIC18LF45K40构建高可信温度传感链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/22 18:19:16

文本预处理实践指南:从分词到数据增强的全流程解析

做文本数据预处理的人,经常被误以为只是在写正则、调停用词表。实际上,分词、子词切分、规范化与数据增强这几件事,每一件都能决定模型最终能跑多好。我最近在做一个短文本分类的模拟项目,数据量不算小,模型也用了预训…

2026/10/22 18:19:16

DSSS扩频信号负信噪比解调原理与Python实现

简介:这是一份面向无线通信初学者与工程实践者的DSSS直接序列扩频信号仿真程序,围绕PN码生成、扩频与解扩频等核心环节展开,可用于理解扩频通信的调制、同步与多址接入原理。资源包共4个文件,均为m脚本文件,压缩包约2K…

2026/10/22 18:19:16

C#高性能Modbus TCP:零拷贝、内存池与管道化架构实践

说到 C# 高性能 Modbus TCP,很多人第一反应是“协议这么简单,性能还能有什么可挖的?”我在一个动辄几百台设备、几万点位的采集项目里也是这么想的,直到压测时发现 GC 每秒飙升几十次、响应延迟忽高忽低,才意识到问题不…

2026/10/22 18:19:16

小团队轻量级CRM系统从零搭建实战:需求、数据模型与核心功能落地

1. 从零搭建客户管理系统的真实动机 很多小团队在业务起步阶段,客户信息散落在各个成员的聊天记录、手机通讯录、Excel表格甚至纸质笔记本里。销售离职带走一批客户、跟进记录找不到、同一个客户被两个人重复联系——这些场景几乎每天都在发生。市面上成熟的客户管理…

2026/10/22 18:14:14

阿里云百炼实战:从零搭建企业大模型知识库问答应用

最近帮一家制造企业做“大模型企业内部知识库”的落地项目,客户上来就问:大模型接入不难,难的是怎么让模型懂我们这行、怎么让回答不出错、怎么让业务部门真的愿意用。我们最后选型用了阿里云百炼做整个应用的基座,从模型调用、知…

2026/10/22 11:29:28

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/22 0:01:49

电商智能运营体系从0到1:架构设计、落地步骤与避坑指南

前两年我们团队接了一个电商平台的运营中台项目,目标很直白:把过去靠运营拍脑袋做的选品、定价、发券、推活动这些事,逐步用数据算法和自动化流程代替。项目名字内部就叫“电商智能运营体系”。最近有不少朋友问我当时是怎么设计的、踩过哪些…

2026/10/22 0:01:49

若依框架AI代码生成不稳定?用Agent Skill三层结构+五步法搞定

最近一段时间,我一直想把后台管理系统里那些机械重复的增删改查代码交给AI去写。框架用的是若依,按理说这类业务代码模式非常固定,应该是AI最擅长的事情。可真试下来却不是那么回事——你让AI生成一个用户管理模块,它给出的Contro…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑