当前位置: 首页 > article >正文

C 语言指针完全指南:创建、解除引用、指针与数组关系解析

C 语言中的指针创建指针我们可以使用引用运算符获取变量的内存地址代码语言cAI代码解释int myAge 43; // 一个 int 变量 printf(%d, myAge); // 输出 myAge 的值 (43) printf(%p, myAge); // 输出 myAge 的内存地址 (0x7ffe5367e044)指针是一个将另一个变量的内存地址作为其值的变量。指针变量指向一个数据类型如int的相同类型并使用*运算符创建。您正在使用的变量的地址被分配给指针代码语言cAI代码解释int myAge 43; // 一个 int 变量 int* ptr myAge; // 一个名为 ptr 的指针变量存储 myAge 的地址 // 输出 myAge 的值 (43) printf(%d\n, myAge); // 输出 myAge 的内存地址 (0x7ffe5367e044) printf(%p\n, myAge); // 使用指针输出 myAge 的内存地址 (0x7ffe5367e044) printf(%p\n, ptr);示例解释:创建一个名为ptr的指针变量指向一个int变量 (myAge)。请注意指针的类型必须与您正在使用的变量的类型匹配本例中为int。使用运算符将myAge变量的内存地址存储并分配给指针。现在ptr存储了myAge的内存地址值。解除引用在上面的示例中我们使用指针变量来获取变量的内存地址与引用运算符一起使用。您还可以通过使用*运算符取消引用运算符获取指针指向的变量的值代码语言cAI代码解释int myAge 43; // 变量声明 int* ptr myAge; // 指针声明 // 引用使用指针输出 myAge 的内存地址 (0x7ffe5367e044) printf(%p\n, ptr); // 解除引用使用指针输出 myAge 的值 (43) printf(%d\n, *ptr);请注意*符号在这里可能会让人困惑因为它在我们的代码中做了两件事当用于声明 (int* ptr) 时它会创建一个指针变量。当不用于声明时它充当取消引用运算符。值得注意在 C 语言中声明指针变量有两种方法代码语言cAI代码解释int* myNum; int *myNum;关于指针的注意事项:指针是 C 语言区别于其他编程语言如 Python 和 Java的一大特点。它们在 C 语言中很重要因为它们允许我们操作计算机内存中的数据。这可以减少代码量并提高性能。如果您熟悉像列表、树和图这样的数据结构您应该知道指针对于实现它们特别有用。有时您甚至必须使用指针例如在处理文件时。但是要小心; 指针必须谨慎处理因为有可能损坏存储在其他内存地址的数据。C 语言中的指针和数组您也可以使用指针访问数组。考虑以下整数数组代码语言cAI代码解释int myNumbers[4] {25, 50, 75, 100}; int i; for (i 0; i 4; i) { printf(%d\n, myNumbers[i]); }结果代码语言cAI代码解释25 50 75 100让我们尝试打印每个数组元素的内存地址而不是打印每个数组元素的值代码语言cAI代码解释int myNumbers[4] {25, 50, 75, 100}; int i; for (i 0; i 4; i) { printf(%p\n, myNumbers[i]); }结果代码语言cAI代码解释0x7ffe70f9d8f0 0x7ffe70f9d8f4 0x7ffe70f9d8f8 0x7ffe70f9d8fc请注意每个元素的内存地址的最后一位数字都不同增加了 4。这是因为int类型的大小通常为 4 个字节请记住代码语言cAI代码解释// 创建一个 int 变量 int myInt; // 获取一个 int 的内存大小 printf(%lu, sizeof(myInt));结果4因此从上面的“内存地址示例”中您可以看到编译器为每个数组元素预留了 4 个字节的内存这意味着整个数组占用 16 个字节4 * 4的内存存储空间代码语言cAI代码解释int myNumbers[4] {25, 50, 75, 100}; // 获取 myNumbers 数组的大小 printf(%lu, sizeof(myNumbers));结果16指针与数组的关系好的那么指针和数组之间有什么关系呢好吧在 C 语言中数组的名称实际上是指向数组第一个元素的指针。感到困惑让我们试着更好地理解这一点并再次使用上面的“内存地址示例”。第一个元素的内存地址与数组的名称相同代码语言cAI代码解释int myNumbers[4] {25, 50, 75, 100}; // 获取 myNumbers 数组的内存地址 printf(%p\n, myNumbers); // 获取第一个数组元素的内存地址 printf(%p\n, myNumbers[0]);结果代码语言cAI代码解释0x7ffe70f9d8f0 0x7ffe70f9d8f0这基本上意味着我们可以通过指针来操作数组怎么操作呢由于myNumbers是指向myNumbers中第一个元素的指针因此您可以使用*运算符来访问它代码语言cAI代码解释int myNumbers[4] {25, 50, 75, 100}; // 获取 myNumbers 中第一个元素的值 printf(%d, *myNumbers);结果25要访问myNumbers中的其他元素您可以增加指针/数组1、2 等代码语言cAI代码解释int myNumbers[4] {25, 50, 75, 100}; // 获取 myNumbers 中的第二个元素的值 printf(%d\n, *(myNumbers 1)); // 获取 myNumbers 中的第三个元素的值 printf(%d, *(myNumbers 2)); // 等等..结果代码语言cAI代码解释50 75或者循环遍历它代码语言cAI代码解释int myNumbers[4] {25, 50, 75, 100}; int *ptr myNumbers; int i; for (i 0; i 4; i) { printf(%d\n, *(ptr i)); }结果代码语言cAI代码解释25 50 75 100您也可以使用指针更改数组元素的值代码语言cAI代码解释int myNumbers[4] {25, 50, 75, 100}; // 将第一个元素的值改为 13 *myNumbers 13; // 将第二个元素的值改为 17最后为了方便其他设备和平台的小伙伴观看往期文章

相关文章:

C 语言指针完全指南:创建、解除引用、指针与数组关系解析

C 语言中的指针创建指针我们可以使用引用运算符 & 获取变量的内存地址:代码语言:cAI代码解释int myAge 43; // 一个 int 变量printf("%d", myAge); // 输出 myAge 的值 (43) printf("%p", &myAge); // 输出 myAge 的内存地…...

告别卡顿!在Windows11上用VirtualBox 7.0.14给Ubuntu 20.04.6分配内存和CPU的黄金法则

告别卡顿!在Windows11上用VirtualBox 7.0.14给Ubuntu 20.04.6分配内存和CPU的黄金法则 你是否遇到过这样的场景:在Windows11上运行Ubuntu虚拟机时,明明分配了大量资源,却依然卡顿不断?特别是在编译AOSP或鸿蒙源码时&am…...

技术解析:brSmoothWeights在Maya角色绑定中的权重平滑与转移技术方案

技术解析:brSmoothWeights在Maya角色绑定中的权重平滑与转移技术方案 【免费下载链接】brSmoothWeights Advanced skin cluster weights smoothing tool for Autodesk Maya 项目地址: https://gitcode.com/gh_mirrors/br/brSmoothWeights 在角色动画制作流程…...

Face Analysis WebUI企业应用:HR部门批量分析候选人照片实现性别/年龄维度初筛

Face Analysis WebUI企业应用:HR部门批量分析候选人照片实现性别/年龄维度初筛 1. 企业招聘场景中的痛点与解决方案 在当今企业招聘流程中,HR部门经常面临海量候选人简历筛选的挑战。特别是当岗位对形象有特定要求时(如前台接待、品牌代言人…...

如何快速部署企业级协同办公平台:DzzOffice完整指南

如何快速部署企业级协同办公平台:DzzOffice完整指南 【免费下载链接】dzzoffice dzzoffice 项目地址: https://gitcode.com/gh_mirrors/dz/dzzoffice 在数字化转型浪潮中,企业协作效率成为核心竞争力。DzzOffice作为开源协同办公平台,…...

赛博萨满:数据中心故障驱魔全纪实

一、数字庙宇的先天之劫数据中心作为数字文明的神殿,其诞生即背负三重原罪:硬件兼容性缺陷如同血脉诅咒般代际传递,代码遗传漏洞构成数字业力循环,环境配置偏差则化作现代风水困局。某银行核心系统曾因祖传代码中的死锁隐患&#…...

Qwen-Image定制镜像惊艳效果展示:RTX4090D上Qwen-VL图文问答真实案例集

Qwen-Image定制镜像惊艳效果展示:RTX4090D上Qwen-VL图文问答真实案例集 1. 开箱即用的高性能推理环境 当拿到这台搭载RTX4090D显卡的服务器时,我第一反应是:这么强大的硬件,配置环境肯定很麻烦吧?但实际使用Qwen-Ima…...

科哥二次开发SenseVoice Small镜像详解:从上传音频到获取带表情文本的全流程

科哥二次开发SenseVoice Small镜像详解:从上传音频到获取带表情文本的全流程 1. 镜像核心能力与价值 如果你正在寻找一个能“听懂”声音里情绪和故事的语音识别工具,那么科哥二次开发的这个SenseVoice Small镜像,可能就是你的答案。它不仅仅…...

ComfyUI自定义节点全攻略:从安装到实战应用(以Segment Anything为例)

ComfyUI自定义节点全攻略:从安装到实战应用(以Segment Anything为例) 引言:为什么需要自定义节点? 在AI图像生成领域,ComfyUI以其模块化设计和可视化工作流赢得了大量专业用户的青睐。但真正让这个平台与众…...

STA 静态时序分析 第三章——标准单元库中的高级功耗建模与优化策略

1. 标准单元库中的功耗建模基础 在纳米级芯片设计中,功耗已经成为与性能同等重要的关键指标。想象一下,你的手机芯片里集成了上百亿个晶体管,每个晶体管开关都会消耗能量,这些能量累积起来就是芯片的总功耗。标准单元库作为芯片设…...

从“教小孩”到“AI成精”:一文聊透AI中的机器学习(下)

上篇我们说到,机器学习的本质是让机器从数据里自己找规律,而不是靠人写规则。这一篇我们来看看,机器学习具体分成哪几类,每一类又是怎么解决实际问题的。你可以把机器学习想象成三种不同的教学方式。每一种都有自己的脾气和适用场…...

别再硬编码了!Tkinter的StringVar/IntVar动态绑定技巧:5分钟实现时钟计数器

Tkinter动态绑定实战:用StringVar/IntVar打造流畅GUI界面 在Python GUI开发中,手动更新界面元素是许多开发者常遇到的痛点。想象一下,你正在开发一个实时数据监控系统,每秒需要更新数十个显示数值——如果采用传统的update()方式&…...

终极指南:如何免Root实现微信平板模式与双设备登录

终极指南:如何免Root实现微信平板模式与双设备登录 【免费下载链接】WeChatPad 强制使用微信平板模式 项目地址: https://gitcode.com/gh_mirrors/we/WeChatPad 你是否曾为微信的单设备登录限制而烦恼?是否希望在工作手机上也能同时登录个人微信&…...

Chord - Ink Shadow 与Dify集成实战:可视化构建企业级AI智能体(Agent)

Chord - Ink & Shadow 与Dify集成实战:可视化构建企业级AI智能体(Agent) 最近在帮一个朋友的公司做内部效率工具升级,他们想引入一个能理解复杂指令、还能处理多步骤任务的AI助手。技术团队人手紧张,从头开发一个…...

Anytype Alpha版深度体验:为什么这款P2P知识管理软件让我放弃了Notion?

Anytype Alpha版深度体验:为什么这款P2P知识管理软件让我放弃了Notion? 第一次打开Anytype时,那种流畅的动画效果和极简的界面让我误以为这又是一款"Notion模仿者"。但当我真正开始构建知识库时,才发现这款软件在底层架…...

丹青识画快速部署:GitHub Actions自动构建镜像+阿里云ACR推送

丹青识画快速部署:GitHub Actions自动构建镜像阿里云ACR推送 1. 项目概述与核心价值 丹青识画是一款融合深度学习技术与东方美学的智能影像识别系统。它能够精准分析图像内容,并以中式书法和水墨意境生成文学化描述,为数字内容赋予艺术灵魂…...

为什么Transformer模型都爱用AdamW?从BERT到ViT的优化器选择实战解析

为什么Transformer模型都爱用AdamW?从BERT到ViT的优化器选择实战解析 在深度学习模型的训练过程中,优化器的选择往往决定了模型能否快速收敛到理想状态。当我们翻开BERT、GPT、ViT等Transformer架构的官方实现时,会发现一个共同点&#xff1a…...

LingBot-Depth与Java基础:开发3D场景分析工具

LingBot-Depth与Java基础:开发3D场景分析工具 1. 引言 如果你是一名Java开发者,想要进入3D视觉和空间感知的领域,可能会觉得这是个门槛很高的技术领域。传统的3D处理往往需要深厚的计算机视觉知识和复杂的C代码,但现在情况不同了…...

Qwen3.5-9B创新落地:盲文图像识别+语音描述实时生成

Qwen3.5-9B创新落地:盲文图像识别语音描述实时生成 1. 技术背景与模型特性 Qwen3.5-9B作为新一代多模态大模型,在视觉-语言融合领域实现了重大突破。该模型通过创新的架构设计,在保持高效推理的同时,显著提升了跨模态理解与生成…...

OpenClaw论文润色:Qwen3-32B学术英语语法检查与改写

OpenClaw论文润色:Qwen3-32B学术英语语法检查与改写 1. 为什么需要自动化论文润色工具 作为一名非英语母语的研究者,我深知论文写作的痛苦。去年投稿顶会时,审稿人直接指出"语言问题严重影响了技术观点的表达"。那次经历让我开始…...

SOONet在体育赛事分析中的效果:自动定位精彩进球与犯规瞬间

SOONet在体育赛事分析中的效果:自动定位精彩进球与犯规瞬间 如果你看过体育比赛,尤其是足球、篮球这类快节奏的项目,一定有过这样的体验:一场90分钟的比赛,真正决定胜负的精彩瞬间可能就那么几分钟。赛后想重温梅西的…...

Dify v0.9.5+ 异步节点开发规范(附GitHub私有仓库级代码模板,仅限本期开放下载)

第一章:Dify v0.9.5 异步节点的核心演进与设计哲学Dify v0.9.5 起引入的异步节点(Async Node)标志着工作流执行模型从同步阻塞向事件驱动架构的关键跃迁。其设计哲学聚焦于“解耦执行”、“弹性伸缩”与“可观测性优先”,旨在支撑…...

OpenClaw 切换底层模型:DeepSeek接入OpenClaw 2026.3.12终极解决方案(零报错版)

相信很多小伙伴升级OpenClaw 2026.3.12版本后,接入DeepSeek时都被各种报错搞疯了——Unknown model: deepseek/deepseek-chat、Unrecognized key: apiKey、anthropic/deepseek-chat,明明配置改了无数遍,网关却始终连不上。今天就给大家带来全…...

OpenClaw新手教程:Windows下用QwQ-32B搭建第一个自动化流程

OpenClaw新手教程:Windows下用QwQ-32B搭建第一个自动化流程 1. 为什么选择OpenClawQwQ-32B组合 去年我开始研究本地化AI自动化工具时,发现市面上的方案要么需要复杂编程,要么必须上传数据到云端。直到遇见OpenClaw这个能直接在Windows上操控…...

鼎捷T100 ERP环境搭建避坑指南:从零开始配置四层架构(含实战命令)

鼎捷T100 ERP环境搭建避坑指南:从零开始配置四层架构(含实战命令) 作为企业数字化转型的核心系统,鼎捷T100 ERP的环境搭建往往成为实施过程中的第一道门槛。记得第一次接手T100项目时,光是配置开发环境就耗费了整整三天…...

IndexTTS2 V23使用技巧:参考音频怎么选?让语音迁移效果更好

IndexTTS2 V23使用技巧:参考音频怎么选?让语音迁移效果更好 在语音合成领域,IndexTTS2 V23版本凭借其出色的情感控制能力,已经成为了许多开发者和内容创作者的首选工具。然而,很多用户在实际使用中发现,虽…...

保姆级教程:用Protel99SE从抄板PCB中精准导出SMT贴片坐标(附Excel整理技巧)

从抄板PCB到SMT贴片:Protel99SE坐标导出与Excel数据清洗全流程解析 在硬件设计与生产衔接的关键环节中,PCB抄板后的文件处理往往是最容易被忽视却至关重要的步骤。当工程师拿到一份通过反向工程获得的DDB文件时,如何准确提取元件坐标并转换为…...

3步掌握fre:ac音频转换:从安装到批量处理全攻略

3步掌握fre:ac音频转换:从安装到批量处理全攻略 【免费下载链接】freac The fre:ac audio converter project 项目地址: https://gitcode.com/gh_mirrors/fr/freac 在数字音乐时代,音频格式转换已成为内容创作者和音乐爱好者的必备技能。fre:ac作…...

低代码开发,让企业应用开发不再难

低代码开发,轻松打造个性化企业应用在当今数字化时代,企业对于应用程序的需求日益增长。然而,传统的开发方式往往需要耗费大量的时间、人力和资源,这对于许多中小企业来说是一个巨大的挑战。你知道吗?低代码开发平台的…...

大模型训练救星:ms-swift断点续传功能实测,再也不怕训练中断

大模型训练救星:ms-swift断点续传功能实测,再也不怕训练中断 你有没有经历过这样的绝望时刻?辛辛苦苦训练了一个星期的大模型,眼看就要出结果了,突然——断电了、服务器宕机了、或者只是不小心关掉了终端。然后呢&…...