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

从Hello World到指针:用5个实际代码片段,彻底搞懂C语言的核心概念与内存模型

从Hello World到指针用5个实际代码片段彻底搞懂C语言的核心概念与内存模型1. 全局变量与局部变量的内存差异让我们从一个最简单的程序开始#include stdio.h int global_var 42; // 全局变量 void test_func() { int local_var 10; // 局部变量 printf(局部变量地址: %p\n, local_var); } int main() { printf(全局变量地址: %p\n, global_var); test_func(); return 0; }运行这个程序你会看到两个变量的内存地址有显著差异。全局变量通常位于数据段而局部变量则位于栈区。这种差异直接影响变量的生命周期和作用域全局变量生命周期整个程序运行期间作用域从定义点到文件末尾存储位置数据段初始化的全局变量或BSS段未初始化的全局变量局部变量生命周期函数调用期间作用域定义它的代码块内部存储位置栈区提示使用%p格式说明符可以打印指针值即内存地址这是理解内存布局的重要工具。2. 函数调用栈与值传递机制C语言中所有函数参数传递都是值传递这个概念常被误解。看下面这个例子#include stdio.h void swap(int a, int b) { int temp a; a b; b temp; printf(函数内: a%d, b%d\n, a, b); } int main() { int x 5, y 10; swap(x, y); printf(主函数: x%d, y%d\n, x, y); return 0; }运行结果会显示虽然在swap函数内部变量值确实交换了但main函数中的原始变量并未改变。这是因为函数调用时参数的值被复制到新的栈帧中函数内部操作的是这些副本函数返回时这些副本被丢弃内存区域存储内容生命周期栈区函数参数、局部变量函数调用期间堆区动态分配的内存直到显式释放数据段全局/静态变量整个程序运行期3. 数组与指针的本质联系数组和指针的关系是C语言中最容易混淆的概念之一。通过以下代码可以直观理解#include stdio.h int main() { int arr[5] {1, 2, 3, 4, 5}; printf(arr %p\n, arr); printf(arr[0] %p\n, arr[0]); printf(*arr %d\n, *arr); printf(*(arr2) %d\n, *(arr2)); printf(arr[2] %d\n, arr[2]); return 0; }关键发现数组名arr实际上是一个指向数组首元素的常量指针arr[i]等价于*(arri)这是编译器提供的语法糖数组名不是普通指针它包含了数组长度的信息sizeof(arr)会返回整个数组的大小注意虽然数组名可以当作指针使用但它不是左值不能进行arr这样的操作。4. 递归调用的栈帧变化递归是理解函数调用栈的绝佳案例。观察这个计算阶乘的递归函数#include stdio.h int factorial(int n) { printf(调用栈深度: %d, n的地址: %p\n, n, n); if (n 1) return 1; return n * factorial(n-1); } int main() { int result factorial(4); printf(4! %d\n, result); return 0; }运行时会看到每次递归调用都会创建一个新的栈帧每个栈帧中的n变量都有不同的内存地址栈帧按照后进先出的顺序销毁递归调用的内存消耗可以用这个公式估算总栈空间 ≈ 单个栈帧大小 × 递归深度5. 指针运算与内存访问指针是C语言的灵魂理解指针运算对掌握内存模型至关重要#include stdio.h int main() { int nums[5] {10, 20, 30, 40, 50}; int *ptr nums; printf(初始指针值: %p\n, ptr); printf(指向的值: %d\n, *ptr); ptr; // 指针算术运算 printf(ptr后: %p\n, ptr); printf(现在指向的值: %d\n, *ptr); printf(ptr2指向的值: %d\n, *(ptr2)); return 0; }关键点指针加减运算的单位是指向类型的大小int通常是4字节ptr会使指针移动sizeof(int)个字节数组索引本质是指针运算的语法糖指针类型运算步长char*1字节int*4字节通常double*8字节通常理解这些底层机制才能真正掌握C语言的精髓。在实际项目中这些知识能帮助你优化内存使用调试复杂的内存错误设计高效的数据结构理解其他系统级编程语言如C、Rust的内存模型

相关文章:

从Hello World到指针:用5个实际代码片段,彻底搞懂C语言的核心概念与内存模型

从Hello World到指针&#xff1a;用5个实际代码片段&#xff0c;彻底搞懂C语言的核心概念与内存模型 1. 全局变量与局部变量的内存差异 让我们从一个最简单的程序开始&#xff1a; #include <stdio.h>int global_var 42; // 全局变量void test_func() {int local_var …...

机器学习课程排行榜:数据驱动的学习路径推荐

1. 项目概述&#xff1a;全网机器学习课程排行榜三年前我刚开始学机器学习时&#xff0c;面对网上数百门课程完全无从下手。直到发现这个由真实学习者评价驱动的排名系统&#xff0c;才找到最适合自己的学习路径。这个项目收集了全球主流学习平台上所有机器学习相关课程的用户评…...

C++:类中的静态成员函数

静态成员函数不与任何对象关联。调用时&#xff0c;它们没有 this 指针。 例如&#xff1a; #include <stdio.h>class Foo { public:static void bar() {printf("hello");}; };int main() {Foo::bar(); }运行输出&#xff1a;...

题解:洛谷 P8817 [CSP-S 2022] 假期计划

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来&#xff0c;并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构&#xff0c;旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大…...

Fire Dynamics Simulator(FDS)火灾模拟完全指南:从零开始掌握专业火灾动力学分析

Fire Dynamics Simulator&#xff08;FDS&#xff09;火灾模拟完全指南&#xff1a;从零开始掌握专业火灾动力学分析 【免费下载链接】fds Fire Dynamics Simulator 项目地址: https://gitcode.com/gh_mirrors/fd/fds Fire Dynamics Simulator&#xff08;FDS&#xff0…...

Android轮播图进阶:手把手教你用com.youth.banner实现指示器与ViewPager2的联动与性能优化

Android轮播图深度优化&#xff1a;基于com.youth.banner的高性能Indicator与ViewPager2联动方案 在移动应用界面设计中&#xff0c;轮播图作为核心视觉元素&#xff0c;其流畅度直接影响用户体验。当用户快速滑动ViewPager2时&#xff0c;Indicator能否实时同步&#xff1f;当…...

Mermaid在线编辑器终极指南:代码驱动图表创作的革命性工具

Mermaid在线编辑器终极指南&#xff1a;代码驱动图表创作的革命性工具 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-ed…...

Qianfan-OCR Java集成开发:SpringBoot服务封装与API调用

Qianfan-OCR Java集成开发&#xff1a;SpringBoot服务封装与API调用 1. 引言 如果你正在开发一个需要处理大量图片文字识别的Java后端系统&#xff0c;Qianfan-OCR可能是个不错的选择。这个教程将带你从零开始&#xff0c;在SpringBoot项目中集成Qianfan-OCR服务&#xff0c;…...

BilibiliDown:3分钟掌握B站视频下载的终极免费解决方案

BilibiliDown&#xff1a;3分钟掌握B站视频下载的终极免费解决方案 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors/…...

KUKA iiwa 机器人FRI JAVA编程实战 -- 从官方Demo到自定义控制模式

1. 从官方Demo到自定义控制模式&#xff1a;FRI JAVA编程入门 第一次接触KUKA iiwa的FRI&#xff08;Fast Robot Interface&#xff09;JAVA编程时&#xff0c;我完全被官方Demo里那些复杂的类名和方法搞懵了。但经过几个项目的实战&#xff0c;我发现只要掌握几个关键点&#…...

3步解决多显示器窗口混乱:PersistentWindows窗口位置持久化工具终极指南

3步解决多显示器窗口混乱&#xff1a;PersistentWindows窗口位置持久化工具终极指南 【免费下载链接】PersistentWindows fork of http://www.ninjacrab.com/persistent-windows/ with windows 10 update 项目地址: https://gitcode.com/gh_mirrors/pe/PersistentWindows …...

Anime4K终极指南:浏览器中实时观看4K动漫的完整解决方案

Anime4K终极指南&#xff1a;浏览器中实时观看4K动漫的完整解决方案 【免费下载链接】Anime4K A High-Quality Real Time Upscaler for Anime Video 项目地址: https://gitcode.com/gh_mirrors/an/Anime4K 想象一下这样的场景&#xff1a;你珍藏多年的老动漫&#xff0c…...

【STM32】STM32实战笔记:独立看门狗与窗口看门狗的配置与调试(47)

1. 看门狗基础&#xff1a;嵌入式系统的"保险丝" 想象一下你正在开发一款工业控制设备&#xff0c;产线上突然传来警报——设备每隔几天就会莫名其妙死机&#xff0c;必须手动重启才能恢复。这种偶发性故障就像一颗定时炸弹&#xff0c;随时可能造成生产事故。这时候…...

高一被开除、16岁被赶出家门,这个广东小伙做出了中国第一台智能手机,却亲手把公司搞没了

大家好&#xff0c;我是写代码的篮球球痴。今天这篇文章&#xff0c;聊一个中国手机圈最让人又爱又恨的人——黄章&#xff08;本名黄秀章&#xff09;&#xff0c;魅族科技的创始人。如果你是 2010 年前后入坑数码的老玩家&#xff0c;一定记得这个名字。他在论坛上叫 J.Wong&…...

别再只盯着卫星图了!用Python+PyTorch实战GeoAI四大核心算法(附代码)

别再只盯着卫星图了&#xff01;用PythonPyTorch实战GeoAI四大核心算法&#xff08;附代码&#xff09; 当无人机掠过农田上空&#xff0c;当卫星凝视城市脉络&#xff0c;海量的地理空间数据正以TB级速度涌入服务器。但真正的问题在于&#xff1a;如何让这些像素开口说话&…...

从零开始:UndertaleModTool完全指南,解锁GameMaker游戏无限可能

从零开始&#xff1a;UndertaleModTool完全指南&#xff0c;解锁GameMaker游戏无限可能 【免费下载链接】UndertaleModTool The most complete tool for modding, decompiling and unpacking Undertale (and other GameMaker games!) 项目地址: https://gitcode.com/gh_mirro…...

别再乱配PATH了!Mac上.zshrc、.bash_profile、.bashrc的区别与正确配置姿势(附Flutter/Java实战)

Mac开发者必知&#xff1a;.zshrc、.bash_profile、.bashrc的终极配置指南 刚接触Mac开发的程序员们&#xff0c;是否经常遇到这样的困惑&#xff1a;明明按照教程配置了环境变量&#xff0c;重启终端后却死活不生效&#xff1f;或者在不同终端工具&#xff08;比如Terminal和i…...

USRP硬件驱动(UHD):软件定义无线电的终极开源解决方案

USRP硬件驱动&#xff08;UHD&#xff09;&#xff1a;软件定义无线电的终极开源解决方案 【免费下载链接】uhd The USRP™ Hardware Driver Repository 项目地址: https://gitcode.com/gh_mirrors/uh/uhd 想象一下&#xff0c;你手中有一台能够接收和发射从50MHz到6GHz…...

如何通过PS2EXE将PowerShell脚本编译为可执行文件:终极指南

如何通过PS2EXE将PowerShell脚本编译为可执行文件&#xff1a;终极指南 【免费下载链接】PS2EXE Module to compile powershell scripts to executables 项目地址: https://gitcode.com/gh_mirrors/ps/PS2EXE 你是否曾经希望将PowerShell脚本转换为独立的Windows可执行文…...

为什么“多路径投票”能降低大模型幻觉?

大语言模型&#xff08;LLMs&#xff09;的飞速发展&#xff0c;让其在内容生成、逻辑推理、知识问答等领域实现了突破性应用&#xff0c;但“幻觉”问题始终是制约其可靠性的关键瓶颈——模型常常生成看似流畅合理、实则与事实不符的内容&#xff0c;小到编造人名地名&#xf…...

如何从Spotify下载音乐并保存完整元数据:完整指南

如何从Spotify下载音乐并保存完整元数据&#xff1a;完整指南 【免费下载链接】spotify-downloader Download your Spotify playlists and songs along with album art and metadata (from YouTube if a match is found). 项目地址: https://gitcode.com/gh_mirrors/spotifyd…...

如何用Python快速创建惊艳的三维可视化:PyVista完整指南

如何用Python快速创建惊艳的三维可视化&#xff1a;PyVista完整指南 【免费下载链接】pyvista 3D plotting and mesh analysis through a streamlined interface for the Visualization Toolkit (VTK) 项目地址: https://gitcode.com/gh_mirrors/py/pyvista 想要在Pytho…...

5步掌握novelWriter:开源小说写作神器的高效创作指南

5步掌握novelWriter&#xff1a;开源小说写作神器的高效创作指南 【免费下载链接】novelWriter novelWriter is an open source plain text editor designed for writing novels. 项目地址: https://gitcode.com/gh_mirrors/no/novelWriter novelWriter是一款专为小说创…...

Requests库超时设置全攻略:从timeout参数到高级重试,告别WinError 10060

Requests库超时设置全攻略&#xff1a;从timeout参数到高级重试&#xff0c;告别WinError 10060 当你在深夜调试爬虫脚本时&#xff0c;突然看到屏幕上跳出TimeoutError: [WinError 10060]的红色报错&#xff0c;那种感觉就像在高速公路上突然爆胎。作为Python开发者&#xff0…...

Pandas大数据处理:7个优化技巧提升性能

1. 大数据集处理的痛点与Pandas优势当数据集超过内存容量时&#xff0c;常规的Pandas操作会变得异常缓慢甚至崩溃。我曾处理过一个电商用户行为数据集&#xff0c;原始CSV文件达到28GB&#xff0c;直接用pd.read_csv()加载导致内核频繁重启。这促使我系统研究了Pandas处理大数据…...

ComfyUI InstantID:AI人脸身份锚定的艺术与科学

ComfyUI InstantID&#xff1a;AI人脸身份锚定的艺术与科学 【免费下载链接】ComfyUI_InstantID 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_InstantID 在AI图像生成的浪潮中&#xff0c;我们面临着一个核心挑战&#xff1a;如何在保持人物身份特征的同时&a…...

终极免费编程游戏指南:如何通过CodeCombat从零掌握编程技能

终极免费编程游戏指南&#xff1a;如何通过CodeCombat从零掌握编程技能 【免费下载链接】codecombat Game for learning how to code. 项目地址: https://gitcode.com/gh_mirrors/co/codecombat CodeCombat是一款革命性的编程学习游戏&#xff0c;它巧妙地将编程知识融入…...

AB Download Manager终极指南:多线程下载与智能文件管理完全教程

AB Download Manager终极指南&#xff1a;多线程下载与智能文件管理完全教程 【免费下载链接】ab-download-manager A Download Manager that speeds up your downloads 项目地址: https://gitcode.com/GitHub_Trending/ab/ab-download-manager AB Download Manager是一…...

从UVM Testbench到门级仿真:手把手教你用VCS +vcs+initreg+random实现可复现的随机初始化

从UVM Testbench到门级仿真&#xff1a;VCS随机初始化实战指南 芯片验证工程师们常遇到一个棘手问题&#xff1a;RTL仿真完美通过的测试用例&#xff0c;在门级仿真时却因寄存器初始状态不一致而失败。本文将深入探讨如何利用VCS的vcsinitregrandom选项&#xff0c;构建既模拟真…...

Stata实证分析:如何用esttab优雅地隐藏行业/年份虚拟变量(附完整代码)

Stata实证分析&#xff1a;优雅隐藏行业与年份虚拟变量的高阶技巧 在学术论文或商业分析报告中&#xff0c;我们经常需要在回归模型中引入行业、年份等虚拟变量来控制固定效应。但直接输出所有虚拟变量的系数会导致结果表格臃肿不堪&#xff0c;关键变量的估计结果反而被淹没在…...