C/C++指针与内存管理图文详解

目录
  • 一.指针
  • 二.数组
  • 总结

指针和内存管理始终是C/C++比较容易模糊的知识点,但在C/C++编程中又绕不开的地方,特别在下位机上,会频繁的与指针打交道,如果概念模糊,一不小心就会写出冗余的代码,可能会引起多余内存开销或者直接影响运行速度。

一.指针

1.计算机内存主要分成这几个区,每个区又分成无数个字节(Byte),每个字节(Byte)都有唯一的编号,而这个编号就这个字节的指针地址。一般程序能读写的区域只有全局变量、堆区、栈区。下面是计算机内存的示意图:

每个字节(Byte)对应的编号地址就是指针地址:

在X86的系统上,每个字节(Byte)都由8位(bit)组成:

2.指针与变量

当定义一个变量的时候,比如 int a = 1025,在X86 系统下IDE会在栈中申请连续的4个字节(Byte)的大小用来存放这个数。如下图:

这个字节大小可以用sizeof(int)来查看。

那么对于int的变量来说,这个4个字节的编号地址就是这个变量的指针地址。

3.字节与bit

4.指向指针的指针,p存放的是x的指针地址,而t则存放的是p的地址。

5.堆中变量,在堆区中new了一块内存。

二.数组

1.一维数组

2.字符数组

3.二维数组

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C++指针与引用的异同

    目录 1.引用与指针的区别 1.1 相同点 1.2 区别 1.引用与指针的区别 指针和引用的原理非常的相似,所以很多时候尤其是面试的时候经常会拿来比较. 本文来梳理一下引用和指针的一些异同. 1.1 相同点 两者都是关于地址的概念. 指针本身是一个变量,它存储的值是一块内存地址,而引用是某一个内存的别名.我们可以使用指针或引用修改对应内存的值. 1.2 区别 引用必须在声明时初始化,而指针可以不用 我们无法声明一个变量引用再给它赋值,只能在声明的同时进行初始化: int a = 3; int &

  • C++函数指针的用法详解

    目录 C++函数指针详细理解 函数指针初识 函数指针作为形参使用 函数指针作为返回值 练习 总结 C++函数指针详细理解 函数指针初识 函数指针是指向函数的指针,并不等于函数,它能够执行函数的操作,可以跟指针变量一起来理解,其基本声明格式为: type (*ptrname)(形参列表); 例子,声明一个比较两个字符串大小的函数指针 bool (*cp)(const string s1, const string s2); 需要注意的是,不要去掉括号!!!如果去掉括号,含义就变成了返回一个bool

  • C++内存管理详细解析

    目录 一.C++内存管理 1. new/delete表达式 2.new/delete重载 3.类内自定义allocator(per-class allocator) 二.多线程内存分配器 1.malloc/free 2.brk和mmap 三.补充知识 1.内存泄漏 2.malloc/free和new/delete的比较 3.RAII规则 一.C++内存管理 C++中有四种内存分配.释放方式: 最高级的是std::allocator,对应的释放方式是std::deallocate,可以自由设计来搭

  • C++ 内存管理原理分析

    1.C/C++中程序内存分布 C/C++中程序内存区域大致划分为:内核空间(这部分用户不能读写).栈.内存映射段.堆.数据段(存储全局数据.静态数据).代码段(存储可执行代码.只读常量,又称常量区). 1.1 内存分布图 1.2 小试牛刀 接下来看下如下代码,思考下每一个变量分别在哪个内存区域? int globalVar = 1; static int staticGlobalVar = 1; void test() { static int staticVar = 1; int localV

  • C++的函数与指针

    目录 函数与指针 指针作函数的参数-实现地址传递 返回指针的函数 指向函数的指针变量 总结 函数与指针 一个函数在编译时被分配一个入口地址,这个入口地址就称为函数的指针.在C++中, 函数名代表函数的入口地址. 指针作函数的参数-实现地址传递 返回指针的函数 利用指向函数的指针调用函数 指针作函数的参数-实现地址传递 指针作函数的参数,具有以下用途: 指针作函数参数,这时形参接受的是实参的地址.函数中通过对指针的间接访问实现参数的按"引用传递"功能 设置多个指针参数可从函数中带回多个结

  • C/C++的内存管理你了解嘛

    目录 C/C++内存分布 C语言中动态内存管理方式 C++ 内存管理方式 new和delete操作自定义类型 new和delete的实现原理 1.内置类型 2.自定义类型 malloc/free和new/delete的区别 总结 C/C++内存分布 int globalVar = 1; static int staticGlobalVar = 1; void Test() { static int staticVar = 1; int localVar = 1; int num1[10] = {

  • C/C++指针与内存管理图文详解

    目录 一.指针 二.数组 总结 指针和内存管理始终是C/C++比较容易模糊的知识点,但在C/C++编程中又绕不开的地方,特别在下位机上,会频繁的与指针打交道,如果概念模糊,一不小心就会写出冗余的代码,可能会引起多余内存开销或者直接影响运行速度. 一.指针 1.计算机内存主要分成这几个区,每个区又分成无数个字节(Byte),每个字节(Byte)都有唯一的编号,而这个编号就这个字节的指针地址.一般程序能读写的区域只有全局变量.堆区.栈区.下面是计算机内存的示意图: 每个字节(Byte)对应的编号地址

  • C语言中动态内存管理图文详解

    目录 1.动态内存开辟的原因 2.动态内存函数的介绍 2.1malloc和free 2.2calloc 2.3realloc 3.常见的动态内存错误 3.1对NULL指针的解引用操作 3.2对动态开辟空间的越界访问 3.3对非动态开辟内存使用free 3.4使用释放一块动态开辟内存的一部分 3.5对同一块动态内存多次释放 3.6动态开辟内存忘记释放(内存泄漏) 4.练习 4.1练习1 4.1练习2 4.3练习3 4.4练习4 5.C/C++程序的内存开辟 总结 1.动态内存开辟的原因 常见的内存

  • SQLServer的内存管理架构详解

    目录 一.Windows的虚拟内存管理器 二.SQL Server 内存体系结构 2.1.传统(虚拟)内存 2.2.地址窗口扩展 (AWE) 内存 三.从 SQL Server 2012 (11.x) 开始发生的改变 3.1.对内存管理的更改 3.2.对memory_to_reserve所做的更改 四.动态内存管理 4.1.堆栈大小 五.缓冲区管理 5.1.缓冲区管理的工作原理 5.2.支持的功能 5.3.磁盘 I/O 5.4.长 I/O 请求 5.5.长时间 I/O 请求的原因 六.了解非一致

  • 关于C/C++内存管理示例详解

    1.内存分配方式 在C++中,内存分成五个区,分别是堆.栈.自由存储区.静态存储区和常量存储区. 1) 栈 执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置处理器指令集中,效率很高,但分配的内存容量有限. 2) 堆 由new分配的内存块,释放由程序员控制.如果程序员没有释放,那么就在程序结束的时候,被操作系统回收. 3) 自由存储区 由malloc等分配的内存块,用free结束自己的生命. 4) 静态存储区 全局变量和静态变量被分配到

  • Java面向对象和内存分析图文详解

    一.Java类 类是面向对象编程中最基本的单位. Java中的类包含三个内容,分别是: 属性 属性又叫成员变量. 属性用于定义类或类对象的数据(静态特征). 范围为整个类体. 方法 方法用于定义类或类对象的行为特征(执行动作)(动态). 方法类似于面向过程中的函数,面向过程中的函数是最基本的单位: 而在面向对象中,最基本单位是类,方法从属于类和对象. 构造方法 构造方法分为无参构造方法:有参构造方法. 构造方法要与类名保持一致. 如果不设置构造方法,则系统自动生成无参构造方法. 属性的定义格式:

  • MySQL 8.0.20 Window10免安装版配置及Navicat管理教程图文详解

    1.MySQL8.0.20下载及解压 下载链接https://dev.mysql.com/downloads/mysql/ 2.新建配置文件my.ini放在D:\mysql-8.0.20-winx64目录下 [client] # 设置mysql客户端默认字符集 default-character-set=utf8 [mysqld] # 设置3306端口 port = 3306 # 设置mysql的安装目录 basedir=D:\\mysql-8.0.20-winx64 # 设置 mysql数据库

  • 图文详解通俗易懂的汇编语言寄存器

    目录 认识寄存器 计算机架构中的寄存器 通用寄存器 AX 寄存器 BX 寄存器 CX 寄存器 DX 寄存器 索引寄存器 状态和控制寄存器 物理地址 什么是段 段寄存器 CS 寄存器 什么是 Code Segment DS 寄存器 栈 栈和 SS 寄存器 栈顶越界问题 我把自己以往的文章汇总成为了 Github ,欢迎各位大佬 star https://github.com/crisxuan/bestJavaer 下面我们就来介绍一下关于寄存器的相关内容.我们知道,寄存器是 CPU 内部的构造,它

  • Java GC 机制与内存分配策略详解

    Java GC 机制与内存分配策略详解 收集算法是内存回收的方法论,垃圾收集器是内存回收的具体实现 自动内存管理解决的是:给对象分配内存 以及 回收分配给对象的内存 为什么我们要了解学习 GC 与内存分配呢? 在 JVM 自动内存管理机制的帮助下,不再需要为每一个new操作写配对的delete/free代码.但出现内存泄漏和溢出的问题时,如果不了解虚拟机是怎样使用内存的,那么排查错误将是一项非常艰难的工作. GC(垃圾收集器)在对堆进行回收前,会先确定哪些对象"存活",哪些已经&quo

  • Java语言中的内存泄露代码详解

    Java的一个重要特性就是通过垃圾收集器(GC)自动管理内存的回收,而不需要程序员自己来释放内存.理论上Java中所有不会再被利用的对象所占用的内存,都可以被GC回收,但是Java也存在内存泄露,但它的表现与C++不同. JAVA中的内存管理 要了解Java中的内存泄露,首先就得知道Java中的内存是如何管理的. 在Java程序中,我们通常使用new为对象分配内存,而这些内存空间都在堆(Heap)上. 下面看一个示例: public class Simple { public static vo

  • Python 开发工具PyCharm安装教程图文详解(新手必看)

    PyCharm是由JetBrains打造的一款Python IDE,VS2010的重构插件Resharper就是出自JetBrains之手. 同时支持Google App Engine,PyCharm支持IronPython.这些功能在先进代码分析程序的支持下,使 PyCharm 成为 Python 专业开发人员和刚起步人员使用的有力工具. PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试.语法高亮.Project管理.代码跳

随机推荐