10. 指针数组和数组指针详细区别

server/2024/9/20 9:19:43/ 标签: c语言, linux

指针数组和数组指针在存储位置和占用内存大小方面也有显著的区别,尤其是它们的结构不同导致内存分布上的差异。接下来详细说明它们在这两个方面的区别:

1. 指针数组 (Array of Pointers)

定义回顾:
int *array[5];

这里 array 是一个指针数组,存储 5 个 int* 类型的指针。

内存分布与存储位置
  • 指针数组本身array 是一个存储指针的数组,这个数组的每个元素都是指针,它们分别指向不同的内存地址。这些指针的存储位置在内存的全局数据段(取决于它的声明位置)。
  • 每个指针指向的地址:这些指针可以指向任意的内存位置,例如(动态分配的内存)或(局部变量的地址)等。指针数组的元素只保存地址,而不直接存储指向数据。
占用的内存大小
  • 指针数组的每个元素是一个指针,而在大多数系统中,指针的大小是固定的,通常为 4 字节(32 位系统)或 8 字节(64 位系统)。
    • 在 64 位系统中,int *array[5]; 占用的总内存大小为:
      5 个指针 * 8 字节 = 40 字节
      
  • 这 40 字节只是用来存储指针的空间,不包括这些指针所指向的数据。
存储结构示意图
int a = 10, b = 20, c = 30;
int *array[3];  // 指针数组array[0] = &a;  // 指向 a 的地址
array[1] = &b;  // 指向 b 的地址
array[2] = &c;  // 指向 c 的地址

内存布局:

array[0] -> 地址A (指向变量 a)
array[1] -> 地址B (指向变量 b)
array[2] -> 地址C (指向变量 c)

在这个例子中,array[0]array[1]array[2] 都是存储地址的指针,每个指针占用 8 字节(在 64 位系统上)。


2. 数组指针 (Pointer to an Array)

定义回顾:
int (*ptr)[5];

这里 ptr 是一个指向包含 5 个 int 元素的数组的指针。

内存分布与存储位置
  • 数组指针本身ptr 是一个指向数组的指针,它存储的是一个数组的起始地址。这个指针的存储位置与指针数组相似,也可以位于全局数据段(取决于声明的位置)。
  • 数组本身ptr 指向的数组是实际存储数据的区域。数组的存储空间通常分配在中(如果是静态数组,通常在栈中;如果是通过动态分配,通常在堆中)。数组的内存是连续的,所有元素在内存中是紧挨着存储的。
占用的内存大小
  • 数组指针 ptr 本身只占用一个指针大小的内存(4 字节在 32 位系统,8 字节在 64 位系统)。
  • 它所指向的数组的大小取决于数组的长度以及元素的类型。假设指向的是 int 类型的数组:
    • 如果 ptr 指向一个大小为 5 的 int 数组,则该数组占用的内存为 5 * sizeof(int) 字节,即 20 字节(在 32 位或 64 位系统上 int 通常是 4 字节)。

因此,假设 ptr 指向一个包含 5 个 int 元素的数组,在 64 位系统上总共占用的内存为:

8 字节(指针大小) + 20 字节(数组大小) = 28 字节
存储结构示意图
int arr[5] = {1, 2, 3, 4, 5};
int (*ptr)[5];  // 数组指针
ptr = &arr;     // 指向数组 arr

内存布局:

ptr -> 数组 arr[5] 的起始地址
arr[0]: 1
arr[1]: 2
arr[2]: 3
arr[3]: 4
arr[4]: 5

在这个示例中,ptr 是一个指针,占用 8 字节,指向整个数组 arr,数组 arr 的大小为 20 字节(假设 int 为 4 字节,数组大小为 5)。


3. 指针数组与数组指针的区别总结

属性指针数组 (type *array[size])数组指针 (type (*ptr)[size])
定义含义一个数组,存储指向 type 类型变量的指针一个指针,指向包含 sizetype 类型元素的数组
内存存储数组中的每个元素存储一个指针,每个指针指向某个内存地址指针本身存储的是数组的起始地址,数组的元素在连续的内存中存储
占用内存指针数组的内存大小 = size * 指针大小 (每个指针占用内存)数组指针本身占用 1 * 指针大小,指向的数组大小由数组元素个数和类型决定
存储位置指针数组在栈或全局数据段,指针指向的数据可在栈或堆中数组指针在栈或全局数据段,指向的数组通常在栈中(如果动态分配在堆中)
使用场景常用于存储多个指针(如多个字符串、动态数组等)常用于指向整个数组的场景,特别是传递多维数组时

4. 进一步说明内存使用的区别

  • 指针数组 只保存多个指针,它们指向不同的数据,而数据的位置可以是栈上或者堆上。因此指针数组的总内存是指针数量 × 单个指针的大小,但指针指向的数据不包含在内。

  • 数组指针 是一个指向整个数组的指针,数组占用的内存是连续的。数组指针的大小固定为一个指针的大小,加上它指向的数组大小(数组大小由数组的长度和类型决定)。

这两个概念主要区别在于内存的布局和存储方式,它们在不同的场景中有不同的用途,选择哪个取决于你是否需要操作多个指针还是需要操作整个数组。


http://www.ppmy.cn/server/104941.html

相关文章

K8S部署MySQL5.7的主从服务

mysql-slave-0是master mysql-slave-1是备份 当mysql写的时候,找headless service中的 mysql-slave-0.mysql57-slave-headless;当mysql读的时候,找clusterip service中的mysql57-slave-read读,实现读写分离。 statefulset维护两个…

Spring + Boot + Cloud + JDK8 + Elasticsearch 单节点 模式下实现全文检索高亮-分页显示 快速入门案例

1. 安装elasticsearchik分词器插件 sudo wget https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-8.13.4.zip sudo mkdir -p ./es_plugins/analysis-ik sudo mkdir ./es_data sudo unzip elasticsearch-analysis-ik-8.13.4.zip -d ./es_plugins/a…

探索提示工程 Prompt Engineering的奥妙

一、探索提示工程 1. 介绍通用人工智能和专用人工智能 人工智能(AI)可以分为通用人工智能(AGI)和专用人工智能(Narrow AI)。AGI是一种能够理解、学习和执行任何人类可以完成的任务的智能。与此相对&#x…

Neo4j 图数据库入门

图形数据库存储节点和关系,而不是表或文档。数据的存储方式就像你在白板上勾画想法一样。您的数据存储不受预定义模型的限制,允许以非常灵活的方式考虑和使用它。 一、核心概念:属性图形模型 Neo4j使用属性图数据库模型。图数据结构由节点(离…

【图形学】TA之路-基于Unity Shader编程之初体验

学习shader之前你必须知道的事情: Unity开发引擎、Direct3D、Shader他们之间的关系 Direct3D 是一个底层图形 API,它直接与 GPU (显卡)交互,提供了访问硬件加速功能的接口。Unity 开发引擎,它封装了很多底…

自然语言处理系列三十九》条件随机场CRF算法原理

注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】 文章目录 自然语言处理系列三十九条件随机场(CRF)算法原理CRF与HMM 总结 …

【LeetCode每日一题】——1046.最后一块石头的重量

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 优先队列 二【题目难度】 简单 三【题目编号】 1046.最后一块石头的重量 四【题目描述】 有…

【Java 搜索二维矩阵 I II,多数元素 I II,分治法 二分法 摩尔投票法】

搜索二维矩阵 I II,多数元素,分治法 & 二分法 & 摩尔投票法 题目1:力扣-搜索二维矩阵[https://leetcode.cn/problems/search-a-2d-matrix/description/](https://leetcode.cn/problems/search-a-2d-matrix/description/)分治-排除法分…

电脑无法新建 Word Excle PPT 这些文件是咋回事

咦 我的电脑怎么没有 Excel文件 Word文件 和 PPT选项嘞 !! 今天突然要写个材料,发现自己新建文件竟然没有excel文档 word和ppt幻灯片这些选项。哦 原来是我自己上次把电脑从win7升级win10系统之后还没有安装wps这些所以不能使用。如果你的电…

【c++】强制类型转化

一、前言 在C语言中新增了四个关键字static_cast、const_cast、reinterpret_cast和dynamic_cast。这四个关键字都是用于强制类型转换的。 新类型的强制转换可以提供更好的控制强制转换过程&#xff0c;允许控制各种不同种类的强制转换。 C中风格是static_cast<type>(c…

ARM/Linux嵌入式面经(二六):韶音

面试体验很好,流程规范,HR细心热情,目前秋招体验最好的一家公司。 一面HR面30min: 1.自我介绍 2.课题组主要做的什么方向 3.聊一聊项目,内容,团队,分工 4.课题组多少人等等。。 5.唠家常 6.其他公司进度 7.意向薪资 二面技术面20min 1.自我介绍 2.OTA 在嵌入式…

linux tomcat jenkins 迁移

最近由于我们的测试和生产环境jenkins频频发生错误&#xff0c;索性尝试了一把在阿里云上做jenkins迁移 在阿里云jenkins安装模式是用tomcat安装部署的 [rootk8s-master local]# ls aegis bin cloudmonitor etc games go ilogtail include lib lib64 libexec sbin…

高性能Web服务器

Nginx的架构和安装Nginx的概述 Nginx &#xff1a; engine X &#xff0c; 2002 年开发&#xff0c;分为社区版和商业版 (nginx plus ) 2019 年 3 月 11 日 F5 Networks 6.7 亿美元的价格收购 Nginx 是免费的、开源的、高性能的 HTTP 和反向代理服务器、邮件代理服务器、以及 T…

【Qt笔记】QPushButton控件详解

目录 一、概述 二、属性 三、方法 四、信号与槽 五、QPushButton的主要功能 六、QPushButton的常用函数方法 1. 构造函数 2. 设置与获取文本 3. 设置与获取图标 4. 设置与获取快捷键 5. 连接信号和槽 6. 启用和禁用按钮 7. 设置默认按钮和自动默认按钮 七、QPush…

DM8守护集群部署、数据同步验证、主备切换

1. 环境描述 实例详情 端口详情 2. 部署步骤 2.1 数据准备 2.1.1主库初始化 [dmdbaray1 ~]$ cd /dmdba/dmdbms/bin [dmdbaray1 bin]$ ./dminit path/dmdba/data PAGE_SIZE32 EXTENT_SIZE32 CASE_SENSITIVEy CHARSET1 DB_NAMEGRP1_RT_01 INSTANCE_NAMEGRP1_RT_01 PORT_NU…

Robot Operating System——自定义Service/Client通信消息结构

大纲 初始化环境生成自定义服务的工程创建包自定义消息package.xml完整文件 CMakeLists.txt完整文件 编译注册 使用自定义服务的工程创建包代码CMakeLists.txt编译运行 工程地址参考资料 在《Robot Operating System——自定义订阅/发布的消息结构》一文中&#xff0c;我们讲解…

USB分析仪USB3.2日志分析

1.简介 USB2.0总线采用轮询模式&#xff0c;即总线事务开始时&#xff0c;都要先发送IN或者OUT令牌包&#xff0c;以通知端点或者查询端点是否准备好。而USB3.2采用了异步通知模式&#xff0c;若端点没有准备好&#xff0c;则主机无需轮询&#xff0c;端点准备好后会通知主机&…

坚持绿色发展的上海智算中心,稳步推进中

自今年年初正式封顶以来&#xff0c;云端股份上海智算中心在外墙及内部的建设进展顺利。这座智算中心地理位置优越&#xff0c;正逐步成为推动数字经济发展的重要力量。 位置优势 云端股份上海智算中心毗邻智慧岛数据产业园&#xff0c;是崇明区目前建设的唯一一座智算中心&am…

深入理解 Go 语言并发编程--管道(channel) 的底层原理

管道是 Go 语言协程间通信的一种常用手段&#xff0c;管道的读写操作也有可能会阻塞用户协程&#xff0c;也就是说有可能会切换到调度器。协程因为管道而阻塞时&#xff0c;只有当其他协程再次读或者写管道时&#xff0c;才有可能解除这个协程的阻塞状态。 1. 管道的基本用法 …

什么是BOM,有哪些分类?

一、什么是BOM&#xff1f; BOM是物料清单的缩写&#xff0c;也称为产品结构表或产品结构树。 BOM的作用主要是通过计算机辅助企业生产管理&#xff0c;使计算机能够识别企业所制造的产品构成和所有要涉及的物料。 在制造业中&#xff0c;BOM是一份详细记录制造某个产品时所…