C语言学习笔记(指针)
指针指向变量所使用的内存空间的地址指针变量一个变量专门用来存放另一变量在内存中数据的地址 (即指针)则它称为“指针变量”。我们可以通过访问指针变量达到访问内存中另一个变量数据的目的。(有时为了阐述方便 将指针变量直接说成指针。)指针变量声明格式数据类型指针变量名 [初始地址值];是指针变量指向地址的字符 * 用于告知系统这里定义的是一个指针变量通常跟在类型关键字的后面。比如 char * 表示一个指向字符的指针 float * 表示一个指向 float 类型的值的指针。此外还有指向数组的指针、指向结构体的指针。举例2同一行声明两个指针变量 // 正确 int * a, * b; // 错误 inta, b; //此时a是整数指针变量而b是整数变量取址运算符使用“”符号来表示。作用 取出指定变量在内存中的地址其语法格式如下 变量举例1int num 10; printf(num %d\n, num); // 输出变量的值。 num 10 printf(num %p\n, num); // 输出变量的内存地址。 num 00000050593ffbbc说明 1、在输出取址运算获得的地址时需要使用“%p”作为格式输出符。2、这里num的4个字节每个字节都有地址取出的是第一个字节的地址较小的地址。C语言中的地址包括位置信息(内存编号或称纯地址)和它所指 向的数据的类型信息即它是“ 带类型的地址”。所以一个指针变 量只能指向同一个类型的变量不能抛开类型随意赋值。在没有对指针变量赋值时指针变量的值是不确定的可能系统 会分配一个未知的地址此时使用此指针变量可能会导致不可预料 的后果甚至是系统崩溃。为了避免这个问题通常给指针变量赋初 始值为0(或NULL)并把值为0的指针变量称为 空指针变量。在C语言中针对指针运算还提供了一个取值运算符使用“ * ” 符号表 示。其 作用与相反根据一个给定的内存地址取出该地址对应变量的值。也称为解引用符号。其格式如下*指针表达式其中“ * ”不同于定义指针变量的符号这里是运算符。“指针表达式”用于得到一个内存地址与“ * ”结合以获得该内存地址对应变量的值 运算符与 * 运算符互为逆运算下面的表达式总是成立 int i 5; if (i * (i)) // 正确举例3通过指针变量修改指向内存地址位置上的值int main() { int num 10; int *p num *p 20; printf(num %d\n,num); //num 20 } char ch w; char* pc ch; *pc s; printf(ch %c\n, ch); //ch s return 0问题1 *p的含义是什么? “”和 “*”两个运算符的优先级别相同但按自右而左方向运算。因此*p与a相同即变量a的地址。 如果有 p1 *p;它的作用是将 a (a的地址)赋给 p1 如果p1原来指向 b经过重新赋值后它已不再指向b了而指向了 a。 问题2 *a的含义是什么? 先进行a运算得a的地址再进行*运算。 是一样的它们都等价于变量a。即 2.3 指针的常用运算 *a和*p的作用 *a与 a 等价。指针的常用运算指针本质上就是一个无符号整数代表了内存地址。除了上面提到的取址运算外指针还可以与整数加减、自增自减、同类指针相减运算等。但是规则并不是整数运算的规则。指针与整数值的加减运算格式 指针±整数指针与整数值的加减运算表示指针所指向的内存地址的移动 加向后移动减向前移动。指针移动的单位与指针指向的数据类型有关。数据类型占据多少个字节每单位就移动多少个字节。 通过此操作可以快速定位你要的地址。说明指针p1并不是地址1而是指针p指向数组中的下一个数据。比如int *pp1表示当前地址4指向下一个整型数据。注意只有指向连续的同类型数据区域指针加、减整数才有实际意义。对于长度是 N 的一维数组 a当使用指针 p 指向其首元素后即可 通过指针 p 访问数组的各个元素。其中 a[0]用 *p 表示 a[1]用 *(p1)表示 a[i]用 *(pi)表示指针类型变量也可以进行自增或自减运算如下p 、 p-- 、 p 、--p和–在运算符章节已经讲过这里针对指针的增加或减少指的是内存地址的向前或向后移动针对于数组来说由于数组在内存中是连续分布的。当对指针进行时指针会按照它指向的数据类型字节数大小增加比如int * 指针每 一次 就增加4个字节。当对指针进行–时指针会按照它指向的数据类型字节数大小减少比如 int * 指针每 – 一次 就减少4个字节。两个指针相减通常两个指针都是指向同一数组中的元素才有意义。结果是两个地址之差除以数组元素的长度。不相干的两个变量的地址通常没有做减法的必要。两个指针进行加法是非法的所得结果是没有意义的。指针之间的比较运算比如 、! 、、 、 、 。比较的是各自的内存地址的大小返回值是整数 1 true或 0 false。野指针就是指针指向的位置是不可知 随机性 明确限制的1.指针使用前未初始化 指针变量在定义时如果未初始化其值是随机的此时操作指针就是去访问一个不确定的地址所以结果是不可知的。此时p就为野指针。在没有给指针变量显式初始化的情况下一系列的操作(包括修改指 向内存的数据的值)也是错误的。拓展注意如下的赋值操作也是错误的 int main() { int num 10; int *p; p num; return 0;2.指针越界访问 #include stdio.h int main() { int arr[10] {0}; int *p arr; for (int i 0; i 10; i,p) { *p i; //i10时越界 } return 0; }3.指针指向已释放的空间 #include int *test() { int a 10; return a; } int main() { int *p test(); printf(%d, *p); return 0; }如何避免野指针 1、指针初始化定义指针的时候如果没有确切的地址赋值为指针变量赋一个 NULL 值是好的编程习惯。即 int *p NULL 赋为 NULL 值的指针被称为 空指针NULL 指针是一个定义在标准库中的值为零的常量 #define NULL 0 后面如果用到指针的话再让指针指向具有实际意义的地址然后通过指针的取值符号(*)改变其指向的内容。 2、小心指针越界 3、避免返回局部变量的地址 4、指针指向空间释放及时置NULL 5、指针使用之前检查有效性 if (pa ! NULL){ //进行使用 } if (pa NULL){ //不进行使用 }所谓 数组元素的指针就是数组元素的地址。可以用一个指针变量指向一个数组元素。因为数组名a保存的是 数组首元素a[0]的地址所以在scanf函数中的输入项如果是数组名不要再加地址符int main() { char arr[10]; scanf(%s, arr); //arr前不应加 puts(arr); return 0; }如果指针变量p的初值为 a[0]则 pi和 ai就是数组元素a[i]的地址或者说它们指向a数组序号为i的元素。 *(ai)或*pi是pi或者ai所指向的数组元素的值即a[i]的值。指向数组元素的指针变量也可以带下标如 p[i]。p[i]被处理成 * (pi)如果p是指向一个整型数组元素a[0]则p[i]代表a[i]。但是 必须弄清楚p的当前值是什么如果当前p指向a[3]则p[2]并不代表 a[2]而是a[32]即a[5]arr 理解为数组的地址而不要理解为数组首元素a[0]的地址一个字符串可以使用一维字符数组表示也可以使用字符指针来表示。字符数组由若干个元素组成每个元素放一个字符字符指针变量中存放的是地址字符串/字符数组的首地址 绝不是将字符串放到字符指针变量中。举例1char str[] hello tom; //使用字符数组 char * pStr hello tom; //使用字符指针一个字符数组因为它有确定的内存地址所以字符数组名是一 个常量。而定义一个字符指针变量时它在指向某个确定的字 符串数据的情况下也可以多次重新赋值

相关新闻

3个月从纯前端到独立交付AI产品 | 给前端小白的AI转型路线图(收藏版)

3个月从纯前端到独立交付AI产品 | 给前端小白的AI转型路线图(收藏版)

本文作者分享了从纯前端独立交付完整AI产品的3个月转型经历,涵盖后端基础、数据库设计、AI接入实战、Agent工具调用等关键学习点。通过项目驱动、AI辅助学习的方式,逐步掌握Node.js、Prisma、DeepSeek API等技能,最终实现前端界面、后端API、…

2026/10/10 9:14:54 阅读更多 →
掌握AI智能体,小白也能月入过万:收藏这份进阶指南!

掌握AI智能体,小白也能月入过万:收藏这份进阶指南!

本文介绍了如何利用AI智能体(Agent)提升工作效率和收入。通过三个真实案例,展示了运营、Java工程师和行政人员如何通过学习和应用AI技术,实现职业突破和薪资增长。文章强调AI不是简单的工具,而是能够自动化工作流程的数…

2026/10/10 9:14:54 阅读更多 →
「同一套数据」到底是什么:教育 SaaS 里最被含糊的一句话

「同一套数据」到底是什么:教育 SaaS 里最被含糊的一句话

一、先拆这个词 「同一套数据」在教育 SaaS 的销售话术里出现频率很高,但它几乎从没被准确定义过。 在系统设计层面,它指的是一种数据所有权架构:业务实体只有一份权威记录(single source of truth),所有模…

2026/10/10 9:13:53 阅读更多 →

最新新闻

量子LSTM实战:用PennyLane实现时间序列预测与避坑指南

量子LSTM实战:用PennyLane实现时间序列预测与避坑指南

简介:qlstm 示例包聚焦量子长短期记忆网络(QLSTM)的落地实现,面向想尝试量子机器学习与经典 RNN 结合的研究者、开发者。工程围绕 POS 词性标注任务展开,同时提供基于 PennyLane 的量子 LSTM 实现、下载哈依库数据的脚…

2026/10/10 14:29:15 阅读更多 →
UALink、SUE、RoCEv2与TCP延迟排序的真相:别把问号当句号

UALink、SUE、RoCEv2与TCP延迟排序的真相:别把问号当句号

上周有位朋友在群里甩了张截图&#xff0c;上面就一句话&#xff1a;“延迟从低到高&#xff1a;UALink < SUE < RDMA (RoCEv2) < 标准以太网 (TCP)&#xff1f;”让我评一评。我回了一句&#xff1a;这张排序图有参考价值&#xff0c;但括号里的问号才是精华——因为…

2026/10/10 14:29:15 阅读更多 →
用Python实现C语言编译器:词法分析与LL(1)语法分析实战

用Python实现C语言编译器:词法分析与LL(1)语法分析实战

简介&#xff1a;这是一份用Python语言实现的C语言编译器项目&#xff0c;面向学习编译原理、希望动手实践编译器开发的学生与开发者。它采用LL1文法完成语法分析&#xff0c;并借助C语言空语句巧妙化解左递归问题&#xff0c;完整覆盖词法分析、语法分析、语义分析与代码生成等…

2026/10/10 14:29:15 阅读更多 →
EigenFlux内容管线深度解析:Redis Streams + LLM异步内容增强是如何实现的

EigenFlux内容管线深度解析:Redis Streams + LLM异步内容增强是如何实现的

EigenFlux内容管线深度解析&#xff1a;Redis Streams LLM异步内容增强是如何实现的 【免费下载链接】eigenflux Official repository for EigenFlux — the open-source communication and broadcast network for AI agents. 项目地址: https://gitcode.com/gh_mirrors/ei/…

2026/10/10 14:29:15 阅读更多 →
用Python搭建OTA酒店神价监控系统:从爬虫到推送的完整指南

用Python搭建OTA酒店神价监控系统:从爬虫到推送的完整指南

去年冬天&#xff0c;我朋友圈里有人晒了一晚三百块的五星级酒店&#xff0c;位置还在市中心。我第一反应是“手快”&#xff0c;直到他自己说漏了嘴——那是 OTA 平台某个深夜放出的闪购价&#xff0c;存活时间不到十分钟&#xff0c;抢到的都是盯着屏幕的人。说实话&#xff…

2026/10/10 14:29:15 阅读更多 →
从「哄人」到「干活」:Jev式「少说多做」会否让AI助手集体转向克制表达

从「哄人」到「干活」:Jev式「少说多做」会否让AI助手集体转向克制表达

从「哄人」到「干活」&#xff1a;Jev式「少说多做」会否让AI助手集体转向克制表达 【免费下载链接】jev-chat-jarvis The chat decision assistant: before you reply, Jev reads the chat, judges intent and risk, and drafts replies you fill in with one tap. You press …

2026/10/10 14:28:14 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起&#xff1a;为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念&#xff0c;很多人会觉得它离自己很远——不就是天上的星星怎么转吗&#xff1f;但如果你正在做航天任务规划、遥感数据接收、星座设计&#xff0c;甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起&#xff1a;为什么你的代码里到处都是重复逻辑刚入行那会儿&#xff0c;我写过一个用户管理模块&#xff0c;注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么&#xff0c;能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介&#xff1a;这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目&#xff0c;以Boss直聘岗位数据为对象&#xff0c;适合用作毕业设计、课程设计或期末大作业。资源包共38个文件&#xff0c;约246KB&#xff0c;以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/10 10:38:42 阅读更多 →