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

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

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.mzph.cn/pingmian/52382.shtml

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

相关文章

MySQL索引失效的场景

创建一个名为test_db的数据库,并在其中创建一个名为test_table的表。该表包含多个字段,并在某些字段上创建索引。 CREATE DATABASE IF NOT EXISTS test_db;USE test_db;CREATE TABLE IF NOT EXISTS test_table (id INT PRIMARY KEY AUTO_INCREMENT,name…

什么样的条件才会造就这样疯狂的末日期权?

今天带你了解什么样的条件才会造就这样疯狂的末日期权?末日期权一般是指期权合约快到期的一周或者最后三天,当然最后一天就是末日期权的疯狂。 末日期权是指那些接近到期日的期权。 由于剩余时间较短,这些期权的时间价值通常非常低&#xf…

一文吃透SpringMVC

一、SpringMVC简介 1、什么是MVC MVC是一种软件架构模式(是一种软件架构设计思想,不止Java开发中用到,其它语言也需要用到),它将应用分为三块: M:Model(模型)&#xf…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第六篇 嵌入式GUI开发篇-第八十五章 Qt控制硬件

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

青龙面板本地部署流程结合内网穿透使用手机远程本地服务器薅羊毛

文章目录 前言一、前期准备本教程环境为:Centos7,可以跑Docker的系统都可以使用。本教程使用Docker部署青龙,如何安装Docker详见: 二、安装青龙面板三、映射本地部署的青龙面板至公网四、使用固定公网地址访问本地部署的青龙面板 …

案例分享—优秀ui设计作品赏析

多浏览国外优秀UI设计作品,深入分析其设计元素、色彩搭配、布局结构和交互方式,以理解其背后的设计理念和趋势。 在理解的基础上,尝试将国外设计风格中的精髓融入自己的设计中,同时结合国内用户的审美和使用习惯,进行创…

Datawhale AI 夏令营 第五期 CV Task1

活动简介 活动链接:Datawhale AI 夏令营(第五期) 以及CV里面的本次任务说明:Task 1 从零上手CV竞赛 链接里的教程非常详细,很适合小白上手,从报名赛事到使用服务器平台再到跑模型,手把手教&…

今日(2024 年 8 月 26 日)科技新闻

鸿蒙智行问界新 M7 Pro 正式发布:今日,鸿蒙智行举行首次新品发布会,问界新 M7 Pro 正式上市,官方售价 24.98 万 - 28.98 万元,同时,鸿蒙智行首款轿跑 SUV 智界 R7 正式亮相。AITO 问界 2 年 5 个月交付 40 …

JavaScript按位与操作详解:原理、应用与注意事项

在JavaScript中,按位与(bitwise AND)是一种二进制操作,它对两个数的二进制表示进行逐位比较。只有当两个相应的二进制位都为1时,结果位才为1,否则为0。这种操作在处理图像、进行权限控制或执行某些特定的数…

easyExcel 填充写时,动态合并单元格

1、定义合并单元格策略获取方法 /** * description: 获取第二个表格的合并策略* param secondTablelist * return: java.util.List<com.alibaba.excel.write.merge.OnceAbsoluteMergeStrategy> * author 30864* date: 2024/8/24 20:27*/ public static List<OnceAbs…

柔版印刷版市场前景:预计2030年全球市场规模将达到20.9亿美元

一、当前市场状况 目前&#xff0c;柔版印刷版市场呈现出较为稳定的发展态势。随着全球经济的逐步复苏&#xff0c;包装印刷等领域对柔版印刷版的需求持续增长。柔版印刷版具有环保、高效、印刷质量高等特点&#xff0c;在食品包装、标签印刷等行业中得到广泛应用。 全球前四…

FlinkCEP - Flink的复杂事件处理详解

目录 Pattern API 单独模式&#xff08;Individual Patterns&#xff09; 量词&#xff08;Quantifiers&#xff09; 条件&#xff08;Conditions&#xff09; 迭代条件 简单条件 组合条件 停止条件 组合模式&#xff08;Combining Patterns&#xff09; 模式组&…

网上商城|基于SprinBoot+vue的分布式架构网上商城系统(源码+数据库+文档)

分布式架构网上商城系统 目录 基于SprinBootvue的分布式架构网上商城系统 一、前言 二、系统设计 三、系统功能设计 5.1系统功能模块 5.2管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍…

微信小程序flex-grow无效

在微信小程序中使用 Flexbox 布局时&#xff0c;如果遇到 flex-grow 属性无效的情况&#xff0c;可能是由几个不同的原因导致的。以下是一些可能的原因和解决方案&#xff1a; 1. 检查 Flex 容器 确保你的父元素&#xff08;即 Flex 容器&#xff09;已经正确设置了 display:…

每期一个小窍门 golang中 CGO_ENABLED 含义

转载 CGO_ENABLED是一个环境变量&#xff0c;用于控制Go编译器是否启用CGO&#xff08;C语言调用Go函数&#xff09;功能。当CGO_ENABLED0时&#xff0c;表示禁用CGO功能。 编译时使用CGO_ENABLED0会导致编译速度较慢的原因有以下几点&#xff1a; 编译器需要额外的时间来检…

时间继电器和定时器

一、概述 1.时间继电器是可以在设定的定时周期内或周期后闭合或断开触点的元器件。 2.时间继电器上可设定的定时周期数量有限&#xff0c;多为一个或两个。定时时长从0.02s至300h(根据产品型号范围不同)。 3.定时器可以理解为一台钟表&#xff0c;它在某个时间点上闭合(断开…

PostgreSQL11 | 事务处理与并发控制

PostgreSQL11 | 事务处理与并发控制 本文章代码已在pgsql11.22版本上运行且通过&#xff0c;展示页由pgAdmin8.4版本提供&#xff0c;本文章第一次采用md文档&#xff0c;效果比csdn官方富文本编辑器好用&#xff0c;以后的文章都将采用md文档 事务管理简介 事物是pgsql中的…

三种相机模型总结(针孔、鱼眼、全景)

相机标定 文章目录 相机标定前言 前言 我们最常见的投影模型Perspective Projection Model描述的就是针孔相机的成像原理。从上面的图根据相似三角形可以得出 参考链接 https://zhuanlan.zhihu.com/p/540969207 相机标定之张正友标定法数学原理详解&#xff08;含python源码&a…

上线eleme项目

&#xff08;一&#xff09;搭建主从从数据库 主服务器master 首先下载mysql57安装包&#xff0c;然后解压 复制改目录到/usr/local底下并且改个名字 cp -r mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql 删掉/etc/my.cnf 这个会影响mysql57的启动 rm -rf /etc…

解读vue3源码-响应式篇3 effect副作用函数

提示&#xff1a;看到我 请让我滚去学习 文章目录 前言effect问题拓展分支切换与 cleanup嵌套的 effect 与 effect 栈解决在副作用函数中同时读取和操作同一属性时无限循环 effect函数实现computed-api 实现图解在这里插入图片描述 总结 前言 什么是副作用函数&#xff1f; 在…