C_内存 内存地址概念

news2025/4/13 0:57:05

1. 计算机内存的基本概念

计算机的内存(RAM,随机存取存储器)是用来存储程序运行时的数据和指令的地方。内存被划分为许多小单元,每个单元有一个唯一的地址,这些地址从0开始编号。

  • 内存单元:每个内存单元通常是一个字节(8位),用来存储一个字符或部分整数。
  • 内存地址:每个内存单元都有一个唯一的地址,用于标识它。例如,地址0x1000表示内存中某个特定位置。

2. C语言中的内存模型

C语言中的内存可以大致分为以下几个区域:

(1)代码区(Text Segment)

  • 存储程序的机器指令(即编译后的代码)。
  • 这部分内存是只读的,防止程序意外修改自己的指令。

(2)全局/静态区(Data Segment) 

  • 存储全局变量和静态变量。
  • 又分为两部分:
  • 初始化数据区:存储已初始化的全局变量和静态变量。
  • 未初始化数据区(BSS段):存储未初始化的全局变量和静态变量。

(3)堆区(Heap)

  • 用于动态内存分配(如malloccallocrealloc等函数分配的内存)。
  • 程序员需要手动管理堆区的内存分配和释放(使用free函数)。
  • 堆的大小不固定,可以根据需要增长。

(4)栈区(Stack) 

  •  用于存储函数调用时的局部变量、函数参数、返回地址等。
  • 栈的大小是固定的,通常较小。
  • 栈是自动管理的,当函数调用结束时,栈上的局部变量会自动销毁。

3. 指针与内存地址的关系

指针是C语言中直接操作内存的核心工具。指针本质上是一个变量,它存储的是另一个变量的内存地址。

 (1)指针的基本概念

  • 指针变量本身占用内存空间(通常是4字节或8字节,取决于系统架构)。
  • 指针变量的值是一个内存地址。

 (2)指针与内存地址的关系    

  

4.通过*解引用指针p,可以直接访问和修改变量a存储在内存中的数值(数据内容),只是改变了该变量a在内存地址中存储的数据内容,而变量a的内存地址本身是保持不变的。

(1)变量在内存中的内存地址 vs  存储值的关系 

 变量在内存中的内存地址

  • 每个变量在声明时  系统为变量分配了一块内存空间, 这块内存空间有一个唯一的固定的地址(0000007BF96FF5D4)   在变量的生命周期内该内存中地址是固定不变的,不会因为值的变化而改变。并且在这块内存空间(也可以叫这个对应的内存地址上)中存储了变量的初始值(比如10)。
  • 内存地址是用来标识变量在内存中的位置。每个变量在内存中都有一个唯一的内存地址。
  • 而存储的数值是该“位置”编号中存放的内容。
  • 修改这个变量的数值并不会改变该变量的内存地址编号。

    存储的值

  • 内存地址对应的存储单元中存放的具体数据。对于变量a来说,存储值就是10
  • 可以通过直接访问变量或通过指针解引用来修改。 

  图解说明

(2)示例代码

    

  /*
 
 系统为变量a2分配了一块内存空间, 这块内存空间有一个唯一的地址(0000007BF96FF5D4),并且在这块内存(也可以叫这个对应的内存地址上)中存储了变量的初始值(比如10)。
 
*/
  int a2 = 10;  // 声明并初始化变量a
  int* p_a2 = &a2;  // 定义一个指针p,指向变量a2的地址

  // 打印初始状态 
  printf("变量2a的初始值=%d\n", a2);  //变量2a的初始值=10
   printf("变量a2在内存中的内存地址编号=%p\n", (void*)&a2); //变量a2在内存中的内存地址编号=0000007BF96FF5D4

  //通过*解引用指针p,可以直接访问和修改变量a2   存储在内存地址 (0000007BF96FF5D4)上对应的数值(数据内容)从10改为20,此时的内存地址没有变,但该内存地址上存储的值已经变为20
   
   * p = 20;  // 相当于 a2 = 20;

 // 打印修改后的状态
    printf("变量a2的修改后值=%d\n", a2);  //变量a2的修改后值=10
    printf("变量a2在内存中的地址编号=%p\n", (void*)&a2); //变量a2在内存中的地址编号=0000007BF96FF5D4

(3)通过以上实例代码,为什么内存地址不变?

  • 变量在内存里的内存地址是由编译器和操作系统在程序运行时分配的,并且在变量的生命周期内是固定不变的。
  • 修改值只会影响内存里单元中的内容(数值),而不会改变变量本身的在内存里的内存地址。

内存地址是变量的位置标识,而值是该位置中存储的内容。修改值只是改变了内容,而位置本身不会发生变化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2333471.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GPT-5、o3和o4-mini即将到来

原计划有所变更: 关于我们应有何期待的一些零散想法。 深度研究(Deep Research)确实强大但成本高昂且速度较慢(当前使用o3模型)。即将推出的o4-mini在性能上可能与o3相近,但将突破这些限制,让全球用户——甚至免费用户(尽管会有速率限制)——都能用上世界顶级AI研究助…

C#MVC项目引用Swagger的详细步骤

目录 一、安装Swagger依赖包二、配置Swagger服务三、启用XML注释四、调整启动配置五、验证与访问常见问题解决 以下是基于ASP.NET Core项目集成Swagger的详细步骤(已适配当前项目结构): 一、安装Swagger依赖包 通过NuGet安装 右键点击项目…

golang 对象池sync.Pool

Golang中的sync.Pool是什么? sync.Pool 是 Go 标准库中提供的一个对象池(Object Pool)实现,用于缓存和复用临时对象,以减少内存分配和垃圾回收(GC)的压力。它的主要特点是: 临时对…

聚焦AI与大模型创新,紫光云如何引领云计算行业快速演进?

【全球云观察 | 科技热点关注】 随着近年来AI与大模型的兴起,云计算行业正在发生着一场大变局。 “在2025年春节期间,DeepSeek两周火爆全球,如何进行私域部署成了企业关心的问题。”紫光云公司总裁王燕平强调指出,AI与…

解决前后端时区不一致问题

前后端时区不一致导致: 》数据不显示在前端 》页面显示时间有误 》一些对时间有要求的方法,无法正确执行,出现null值,加上我们对null值有判断/注解,程序就会报错中断,以为是业务逻辑问题,其实…

STL之序列式容器(Vector/Deque/List)

序列式容器 序列式容器包括:静态数组 array 、动态数组 vector 、双端队列 deque 、单链表 forward_ list 、双链表 list 。这五个容器中,我们需要讲解三个 vector 、 deque 、 list 的使 用,包括:初始化、遍历、尾部插入与删除、…

小试牛刀-抽奖程序

编写抽奖程序 需求:设计一个抽奖程序,点击抽奖按钮随机抽取一个名字作为中奖者 目标:了解项目结构,简单UI布局,属性方法、事件方法,程序运行及调试 界面原型 ​ 待抽奖: 点击抽奖按钮&#x…

从 MySQL 切换到国产 YashanDB 数据库时,需要在数据库字段和应用连接方面进行适配 ,使用总结

YashanDB | 崖山数据库系统 - 崖山科技官网崖山数据库系统YashanDB是深圳计算科学研究院完全自主研发设计的新型数据库系统,融入原创理论,支持单机/主备、共享集群、分布式等多种部署方式,覆盖OLTP/HTAP/OLAP交易和分析混合负载场景&#xff…

【学习笔记】头文件中定义函数出现重复定义报错

目录 错误复现原因解决方案inlinestatic 扩展参考 错误复现 现在有一个头文件 duplicate_define.h 和两个源文件 duplicate_define_1.cpp 和 duplicate_define_2.cpp。 两个源文件都引入了头文件 duplicate_define.h,且在各自的函数中调用了定义在头文件中的全局函…

游戏开发中 C#、Python 和 C++ 的比较

🎬 Verdure陌矣:个人主页 🎉 个人专栏: 《C/C》 | 《转载or娱乐》 🌾 种完麦子往南走, 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️ 摘要: 那么哪种编程语言最适合游戏开发…

DeepSeek 都开源了哪些技术?

DeepSeek作为中国领先的人工智能企业,通过开源策略推动了全球AI技术的普及与创新。以下是其官方公布的主要开源项目及其技术内容、应用场景和社区反馈的详细分析: 1. FlashMLA 技术描述:专为Hopper架构GPU优化的高效MLA(Multi-Layer Attention)解码内核,针对可变长度序列…

P8754 [蓝桥杯 2021 省 AB2] 完全平方数

题目描述 思路 一看就知道考数学,直接看题解试图理解(bushi) 完全平方数的质因子的指数一定为偶数。 所以 对 n 进行质因数分解,若质因子指数为偶数,对结果无影响。若质因子指数为奇数,则在 x 中乘以这个质因子,保证指…

ADGaussian:用于自动驾驶的多模态输入泛化GS方法

25年4月来自香港中文大学和浙大的论文“ADGaussian: Generalizable Gaussian Splatting for Autonomous Driving with Multi-modal Inputs”。 提出 ADGaussian 方法,用于可泛化的街道场景重建。所提出的方法能够从单视图输入实现高质量渲染。与之前主要关注几何细…

0501路由-react-仿低代码平台项目

文章目录 1 react路由1.1 核心库&#xff1a;React Router安装 1.2 基本路由配置路由入口组件定义路由 1.3 导航方式使用 <Link> 组件编程式导航 1.4 动态路由参数定义参数获取参数 1.5 嵌套路由父路由配置子路由占位符 1.6 重定向与404页面重定向404页面 1.7 路由守卫&a…

OpenAI即将上线新一代重磅选手——GPT-4.1

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【蓝桥杯】赛前练习

1. 排序 import os import sysn=int(input()) data=list(map(int,input().split(" "))) data.sort() for d in data:print(d,end=" ") print() for d in data[::-1]:print(d,end=" ")2. 走迷宫BFS import os import sys from collections import…

Windows 系统下用 VMware 安装 CentOS 7 虚拟机超详细教程(包含VMware和镜像安装包)

前言 资源 一、准备工作 &#xff08;一&#xff09;下载 VMware Workstation &#xff08;二&#xff09;下载 CentOS 7 镜像 二、安装 VMware Workstation&#xff08;比较简单&#xff0c;按下面走即可&#xff09; 三、创建 CentOS 7 虚拟机 四、安装 CentOS 7 系统…

五、用例篇

Bug等级&#xff1a;崩溃、严重、一般、次要 bug的生命周期 面试高频考题&#xff1a;跟开发产生争执怎么办&#xff1f; (1)反思自己&#xff0c;是不是bug描述写的不清楚 (2)站在用户思考问题&#xff0c;反问开发人员&#xff1a;“如果你是用户&#xff0c;你能接受这样…

【QT】学习笔记1

QT概述 Qt是一个1991年由QtCompany开发的跨平台C图形用户界面应用程序开发框架。它既可以开发GUI程序&#xff0c;也可用于开发非GUI程序&#xff0c;比如控制台工具和服务器。Qt是面向对象的框架&#xff0c;使用特殊的代码生成扩展&#xff08;称为元对象编译器&#xff08;…

英伟达开源253B语言模型:Llama-3.1-Nemotron-Ultra-253B-v1 模型情况

Llama-3.1-Nemotron-Ultra-253B-v1 模型情况 1. 模型概述 Llama-3.1-Nemotron-Ultra-253B-v1 是一个基于 Meta Llama-3.1-405B-Instruct 的大型语言模型 (LLM)&#xff0c;专为推理、人类对话偏好和任务&#xff08;如 RAG 和工具调用&#xff09;而优化。该模型支持 128K 令…