数组指针和指针数组的区别
数组指针和指针数组的区别
根据我个人的理解如下:
数组指针:指向数组的指针。着重点在于最后的指针两个字。
指针数组: 所有元素都是指针的数组。着重点在于最后的数组两个字。
另外来看助手的回答:
Kimi:
1. **数组指针(Array of Pointers)**:- 这是指一个指针数组,即一个数组,其元素都是指针。- 声明方式:`类型指针 *指针数组名[数组大小];`- 例如:`int *array[10];` 这里`array`是一个包含10个`int`类型指针的数组。
2. **指针数组(Pointer to an Array)**:- 这是指一个指向数组的指针,即一个指针,它指向一个数组。- 声明方式:`类型指针 (*指针名)[数组大小];`- 例如:`int (*pArray)[10];` 这里`pArray`是一个指针,它指向一个有10个`int`类型元素的数组。它们之间的主要区别包括:- **内存分配**:- 数组指针(Array of Pointers):每个指针单独分配内存,它们可以指向不同大小的数组。- 指针数组(Pointer to an Array):整个数组作为一个整体被分配内存,指针指向这个数组的开始。
- **初始化**:- 数组指针(Array of Pointers):可以单独初始化每个指针。- 指针数组(Pointer to an Array):初始化时需要一个指向数组的指针。
- **使用**:- 数组指针(Array of Pointers):通过`指针数组名[index]`访问指针,然后通过`*指针数组名[index]`访问指向的数据。- 指针数组(Pointer to an Array):通过`(*指针名)[index]`直接访问数组中的元素。
- **内存连续性**:- 数组指针(Array of Pointers):指针数组中的指针不一定指向连续的内存区域。- 指针数组(Pointer to an Array):指针指向的数组中的元素是连续存放在内存中的。
抖音旗下的豆包:
豆包:
数组指针:是一个指针,它指向一个数组。可以理解为这个指针保存的是整个数组在内存中的起始地址。例如,对于一个包含多个元素的数组int arr[5];,int (*p)[5];就是一个数组指针,p可以指向arr。
指针数组:是一个数组,这个数组的元素是指针。例如int *p[5];,这里定义了一个数组p,它有 5 个元素,每个元素都是一个int *类型的指针。
定义方式
数组指针:
语法为类型 (*指针变量名)[数组大小];。例如,double (*ptr)[3];定义了一个指针ptr,它可以指向一个包含 3 个double类型元素的数组。
一般在处理二维数组时较为常用。例如,对于二维数组int a[2][3];,可以定义一个数组指针int (*p)[3] = a;,这里p指向二维数组a的第一行(因为二维数组在内存中是按行存储的,a的第一行可以看作是一个包含 3 个int元素的数组)。
指针数组:
语法为类型 *指针数组名[数组大小];。如char *str_array[4];,这表示str_array是一个数组,有 4 个元素,每个元素都是一个指向char类型的指针。
常用于存储多个字符串(C 语言中字符串实际上是字符数组,而字符串的名字是指向字符数组首元素的指针)。例如,可以用指针数组来存储多个字符串字面量:char *weekdays[] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};。
内存占用和存储内容
数组指针:
占用的内存空间大小通常和机器字长有关,在 32 位机器上一般是 4 字节,在 64 位机器上一般是 8 字节。它存储的是数组的首地址,通过这个指针结合偏移量可以访问数组中的各个元素。
例如,对于数组int arr[5];,如果数组指针p指向arr,那么*(p + 1)就可以访问arr[1](假设p是正确定义和初始化的数组指针)。
指针数组:
内存占用空间为数组元素个数乘以每个元素(指针)所占用的空间。例如,在 32 位机器上,int *p[5]占用5 * 4 = 20字节。
存储的是多个指针,每个指针可以指向不同的内存地址。例如,在上面的weekdays指针数组中,每个元素分别指向一个字符串字面量在内存中的起始位置。
下面直接用代码来说明助手谁是正确的呢:
1.数组指针
// 定义一个含有10个元素的int 数组int a1[10] = { 0,1,2,3,4,5,6,7,8,9 };
// 数组指针:指向数组的指针
// 定义一个指针p,该指针指向一个含有10个int元素的数组int (*p)[10];
// 指针p指向a1;p = &a1;cout << "数组指针输出指针所指向的那个数组的元素" << endl;for (int i = 0; i < 10; i++){// (*p): 即a1,(*p)[i]:即a1[i];std::cout << (*p)[i] << std::endl;}
2.指针数组
// 指针数组:数组的每个元素都是一个指针// pArr是一个数组,含有10个int* ,并且初始化为数组a1各元素的地址int* pArr[10] = { &a1[0],&a1[1],&a1[2],&a1[3],&a1[4],&a1[5],&a1[6],&a1[7],&a1[8],&a1[9]};for (int i=0;i < 10;i++){// pArr[i]:是指针,指向a1的各个元素;*(pArr[i]):对指针解引用,即获取指针指向的值。std::cout << *(pArr[i]) << std::endl;}
上面的代码运行结果如下:

总代码如下:
// 数组指针:指向数组的指针int a1[10] = { 0,1,2,3,4,5,6,7,8,9 };int (*p)[10];p = &a1;cout << "数组指针输出指针所指向的那个数组的元素" << endl;for (int i = 0; i < 10; i++){std::cout << (*p)[i] << std::endl;}cout << "输出指针数组中数组元素指向的数组的值" << endl;// 指针数组:数组的每个元素都是一个指针int* pArr[10] = { &a1[0],&a1[1],&a1[2],&a1[3],&a1[4],&a1[5],&a1[6],&a1[7],&a1[8],&a1[9]};for (int i=0;i < 10;i++){std::cout << *(pArr[i]) << std::endl;}system("pause");
由此可以证明:豆包的解释是更加正确的,也和我个人理解相同。
相关文章:
数组指针和指针数组的区别
数组指针和指针数组的区别 根据我个人的理解如下: 数组指针:指向数组的指针。着重点在于最后的指针两个字。 指针数组: 所有元素都是指针的数组。着重点在于最后的数组两个字。 另外来看助手的回答: Kimi: 1. **数组指针(Ar…...
【VUE点击父组件按钮,跳转到子组件】
要实现在Vue中,父组件通过点击按钮进入子组件的 <el-dialog> 弹窗,并在弹窗中嵌套 <el-table> 表格,可以按照以下步骤进行编写代码: 在父组件中,定义一个数据属性用于控制子组件弹窗的显示与隐藏。 data…...
Java列表排序:方法与实践
在Java编程中,列表排序是一个常见且重要的任务。本文将介绍Java中对列表进行排序的几种方法,包括使用Collections.sort()、List.sort()以及自定义排序规则。 1. 使用Collections.sort() Collections.sort()是Java提供的一个静态方法,用于对…...
哈希及其封装实现unordermap和set
哈希 直接定址法 哈希和之前的红黑树的区别就是,它是通过映射关系来找到目标的,可以把它想象成之前排序的计数排序,那其实就是哈希的一种方法,叫做直接定址法。 对于比较集中的数据,它只需要开一段区间,…...
在 AMD GPU 上构建解码器 Transformer 模型
Building a decoder transformer model on AMD GPU(s) — ROCm Blogs 2024年3月12日 作者 Phillip Dang. 在这篇博客中,我们展示了如何使用 PyTorch 2.0 和 ROCm 在单个节点上的单个和多个 AMD GPU 上运行Andrej Karpathy’s beautiful PyTorch re-implementation …...
Canvas简历编辑器-选中绘制与拖拽多选交互设计
Canvas简历编辑器-选中绘制与拖拽多选交互设计 在之前我们聊了聊如何基于Canvas与基本事件组合实现了轻量级DOM,并且在此基础上实现了如何进行管理事件以及多层级渲染的能力设计。那么此时我们就依然在轻量级DOM的基础上,关注于实现选中绘制与拖拽多选交…...
简单工厂(Simple Factory)
简单工厂(Simple Factory) 在创建一个对象时不向客户暴露内部细节,并提供一个创建对象的通用接口。 说明: 简单工厂把实例化的操作单独放到一个类中,这个类就成为简单工厂类,让简单工厂类来决定应该用哪…...
ffmpeg拉流分段存储到文件-笔记
通过ffmpeg可以从rtsp网络流拉取数据并存储到本地文件里,如下命令。做个笔记 ffmpeg -rtsp_transport tcp -i rtsp://192.168.1.168:6880/live -c copy -f segment -segment_time 60 stream_piece_%d.mp4这条 ffmpeg 命令的作用是从一个 RTSP 流中捕获视频ÿ…...
Java 实习工资大概是多少?——解读影响薪资的因素
文章目录 1. 城市因素:一线、二线的差距2. 公司类型:互联网公司、外企和传统企业的差别3. 个人能力:经验、技术栈的重要性4. 其他影响因素:学历和实习时间总结推荐阅读文章 Java 开发作为广泛应用的职业方向,实习工资的…...
【Linux】万字详解:Linux文件系统与软硬链接
🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 🚀 前言 一: 🔥 磁盘的物理结构二: 🔥 磁盘的存储结构 三: 🔥 磁盘的逻辑结构 四: &#…...
spacenavd
介绍spacenavd开源项目,主要是因为在斯坦福大学的UMI项目中使用了该项目。在斯坦福大学的 UMI(Universal Manipulation Interface)项目中,Spacenavd 主要用于处理 3D Space Mouse(空间鼠标)的输入…...
C#WPF的XAML的语法详谈和特性
WPF的XAML(eXtensible Application Markup Language)是一种基于XML的标记语言,用于在.NET框架中定义和描述用户界面。XAML提供了一种声明性的方式来构建应用程序的UI元素,包括窗口、控件、布局、样式、动画和数据绑定等。 XAML的…...
一篇文章讲透数据结构之二叉搜索树
前言 在前面的学习过程中,我们已经学习了二叉树的相关知识。在这里我们再使用C来实现一些比较难的数据结构。 这篇文章用来实现二叉搜索树。 一.二叉搜索树 1.1二叉搜索树的定义 二叉搜索树(Binary Search Tree)是基于二叉树的一种升级版…...
新手入门c++(8)
到时候了,是时候给你们讲一下其他的定义形式与格式化输入输出了。 1.长整型变量 长整型变量分为两种: ①long类型 在计算机编程中,long 类型是一个整型数据类型,用于存储较大的整数。它的大小和范围取决于操作系统和编译器的实…...
新手铲屎官提问,有哪几款噪音低的宠物空气净化器推荐
相信很多铲屎官都明白的的痛就是猫咪掉毛太严重,所以每次看到满天飞的浮毛时只想赶紧逃离,一点都不想清理。但是家是自己的,猫是自己的,健康也是自己的,不清理也得清理。 为了更有效的清理浮毛,我朋友特意…...
解决RabbitMQ脑裂问题
文章目录 前言一、现象二、解决办法 前言 RabbitMQ脑裂 一、现象 RabbitMQ镜像群出现脑裂现象,各个节点的MQ实例都“各自为政”,数据并不同步。 二、解决办法 # 停止mq sh rabbitmq-server stop_app # 查看mq进程是否存在 ps -ef | grep rabbitmq # …...
经纬恒润AUTOSAR成功适配芯钛科技Alioth TTA8车规级芯片
在汽车电子领域,功能安全扮演着守护者的角色,它确保了车辆在复杂多变的情况下保持稳定可靠的运行。随着汽车电子的复杂性增加,市场对产品功能安全的要求也日益提高。基于此背景,经纬恒润AUTOSAR基础软件产品INTEWORK-EAS-CP成功适…...
4、java random随机数、一维数组、二维数组
目录 Random类与随机数生成数组的概述与使用数组的内存分配与访问数组的常见问题与解决方案一维数组的遍历与操作二维数组的概述与遍历1. Random类与随机数生成 引言 在编程中,我们经常需要生成随机数,比如在游戏、模拟实验或者数据处理中。Java提供了一个非常方便的类Rand…...
C++ 魔法三钥:解锁高效编程的封装、继承与多态
快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 目录 💯前言 💯封装 1.封装概念 2.封装格式 3.封装的原理 4.封装的作用 💯继承 1.继承的概念 2.继承格式 3.继承的…...
姿态传感器(学习笔记上)
上节我们学的是温湿传感器,这节我们学的是姿态传感器,虽然都是传感器,但是它们还是有很大的区别的,这节的传感器我们通过学习可知,开发板上的姿态传感器型号是QMI8658C,内部集成3轴加速度传感器和3轴陀螺仪…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
算法—栈系列
一:删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...
LangChain【6】之输出解析器:结构化LLM响应的关键工具
文章目录 一 LangChain输出解析器概述1.1 什么是输出解析器?1.2 主要功能与工作原理1.3 常用解析器类型 二 主要输出解析器类型2.1 Pydantic/Json输出解析器2.2 结构化输出解析器2.3 列表解析器2.4 日期解析器2.5 Json输出解析器2.6 xml输出解析器 三 高级使用技巧3…...
