数组指针
数组指针的定义
1.数组指针是指针还是数组?
指针。
int a = 10;int* p = &a;//指向整型数据的指针
char b = 'w';char* q = &b;//指向字符变量的指针
所以数组指针应该是指向数组的指针。
2.数组指针应该怎么定义?
int arr[10] = { 0 };int(*p)[10] = &arr;
在数组指针定义时区别指针数组的定义,指针数组的定义如下
int* p1[10];
本质还是数组,该数组元素类型为int*,所以每个元素存放的是地址。
3.数组指针定义的解释
int arr[10] = { 0 };int(*p)[10] = &arr;
说明:p和*结合,说明p是一个指针变量,该指针指向大小为10个整型的大小的数组,所以p是一个指针,指向一个数组,叫做数组指针。
分析下面的代码
int main()
{int arr[10] = { 0 };printf("%p\n", &arr[0]);printf("%p\n", arr);printf("%p\n", &arr);}
运行结果展示
为什么三个地址一样呢?难道他们三个的意思是一样的?接着看下面的代码
int main()
{int arr[10] = { 0 };printf("%p\n", &arr[0]);printf("%p\n", &arr[0] + 1);printf("%p\n", arr);printf("%p\n", arr+1);printf("%p\n", &arr);printf("%p\n", &arr+1);}
分别给地址做加1操作得到结果如下

可以发现上面两个是地址加一是跳四个字节,而最后一个4->c,差个8,a->c,差了个2,由于十六进制2相当于32,32+8=40,最后一个差了四十个字节,所以其实三个的意思并不一样,
&arr[0]:首元素的地址
arr:数组名表示的是数组的首地址
&arr:表示整个数组的地址;
前两个都可以用整型指针存放他们的地址,最后一个可以用数组指针来存放他的地址
int arr[10] = { 0 };int(*p)[10] = &arr;
4.数组指针的使用
void print( int(*p)[10],int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", *(*p + i));}}
int main()
{int arr[10] = { 1 ,2 ,3, 4, 5, 6, 7, 8, 9, 10 };int sz = sizeof(arr) / sizeof(arr[0]);print(arr, sz);
}
有人会问arr应该用int*去接收,为什么用int(*p)[10]这个也可以呢?可能编译器做了优化,不会报错
void print( int(*p)[10],int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", *(*p + i));}
}
int main()
{int arr[10] = { 1 ,2 ,3, 4, 5, 6, 7, 8, 9, 10 };int sz = sizeof(arr) / sizeof(arr[0]);print(&arr, sz);
}
下面的改成了整个数组的地址,这样理解才和上面说的一致
*(*p + i)
解释一下这一行p代表的是整个数组的地址,对p解引用*p,相当于拿到整个数组,所以*p相当于数组名,而数组名相当于首元素地址,+i操作就是对首元素地址跳四i个字节,然后对(*p+i)解引用得到的*(*p+i)得到对应地址上存的值,一般不用数组指针在一维数组上,下面举例在二维数组上的使用
void print(int(*p)[4], int k, int q)
{for (int i = 0; i < k; i++){int j = 0;for (j = 0; j < q; j++){printf("%d ",*(*(p+i)+j));}printf("\n");
}
}
int main()
{int arr[3][4] = { {1,2,3,4},{4,5,6,7},{6,7,8,9} };print(arr, 3, 4);
}
*(*(p+i)+j)
这里的p+i,相当于第i行整行数组的地址,*(p+i)相当于拿到了这一行数组,也相当于数组名,也相当于这一行首元素地址,(*(p+i)+j),指的是这一行第j+1元素的地址,然对(*(p+i)+j)解引用得到的是*(*(p+i)+j)就是arr[i][j];
运行结果展示
int(*p)[4]这个数组指针相当于存的是将这个二维数组的整个一行数组的地址。
希望可以帮助到大家,如果有不对的地方希望大佬指教,谢谢大家了
相关文章:
数组指针
数组指针的定义 1.数组指针是指针还是数组? 指针。 int a 10;int* p &a;//指向整型数据的指针 char b w;char* q &b;//指向字符变量的指针 所以数组指针应该是指向数组的指针。 2.数组指针应该怎么定义? int arr[10] { 0 };int(*p)[10] …...
C++设计模式之过滤器设计模式
C过滤器设计模式 什么是过滤器设计模式 过滤器设计模式是一种行为型设计模式,它允许你在特定的条件下对输入或输出进行过滤,以便实现不同的功能。 该模式有什么优缺点 优点 可扩展性:过滤器设计模式允许您轻松地添加、删除或替换过滤器&a…...
SpringBoot整合RedisTemplate操作Redis数据库详解(提供Gitee源码)
前言:简单分享一下我在实际开发当中如何使用SpringBoot操作Redis数据库的技术分享,完整的代码我都提供了出来,大家按需复制使用即可! 目录 一、导入pom依赖 二、yml配置文件 三、使用FastJson序列化 四、核心配置类 五、工具…...
SQL 执行计划管理(SPM)
一、SPM 需求背景 任何数据库应用程序的性能在很大程度上都依赖于查询执行,尽管优化器无需用户干预就可以评估最佳计划,但是 SQL 语句的执行计划仍可能由于以下多种原因发生意外更改:版本升级、重新收集优化器统计信息、改变优化器参数或模式…...
浅谈微服务异步解决方案
导言 异步是一种设计思想,不是设计目的,因此不要为了异步而异步,要有所为,有所不为。 异步不是『银弹』, 避免试图套用一个『异步框架』解决所有问题, 需要根据不同的业务特点或要求,选择合适的…...
【音视频SDK测评】线上K歌软件开发技术选型
摘要 在线K歌软件的开发有许多技术难点,需考虑到音频录制和处理、实时音频传输和同步、音频压缩和解压缩、设备兼容性问题等技术难点外,此外,开发者还应关注音乐版权问题,确保开发的应用合规合法。 前言 前面写了几期关于直播 …...
Jackson:String转object反序列化失败
场景 消费mq时String转Object 代码 for (MessageExt msg : msgs) {String msgBody new String(msg.getBody(), StandardCharsets.UTF_8);BinlogEvent binlogEvent JsonUtil.silentString2Object(msgBody, BinlogEvent.class);binlogEvent.setPort(Long.valueOf(port));tCo…...
Spark_Core---6
spark 相关概念补充 课程目标 了解spark的安装部署知道spark作业提交集群的过程 6.1 spark的安装部署 1、下载spark安装包 http://spark.apache.org/downloads.html 高版本不存在cdh的编译版本,可以从官网下载源码版本,指定高版本hadoop进行编译 编译…...
游戏运营需要什么条件和准备?
游戏运营是一个复杂的过程,需要综合考虑多个因素。以下是一些游戏运营需要的条件和准备: 1、良好的游戏产品 首先,需要有一款优秀、有吸引力的游戏产品。游戏的质量和内容决定了用户是否愿意下载、留存和付费。 2、游戏运营团队 拥有专业…...
SVN限制Message提交的格式
限制Message提交的格式必须为以下格式 [Version] [Description] [TPA] [Doors] REPOS"$1" TXN"$2"# Make sure that the log message contains some text. SVNLOOK/usr/bin/svnlook MSG$SVNLOOK log -t "$TXN" "$REPOS"if [[ $MSG ~ …...
windows下安装anaconda、pycharm、cuda、cudnn、PyTorch-GPU版本
目录 一、anaconda安装及虚拟环境创建 1.anaconda的下载 2.Anaconda的安装 3.创建虚拟环境 3.1 环境启动 3.2 切换镜像源 3.3环境创建 3.4 激活环境 3.5删除环境 二、pycharm安装 1.pycharm下载 2.pycharm的安装 三、CUDA的安装 1.GPU版本和CUDA版本、cudnn版本、显卡…...
【计算机网络】传输层协议 -- UDP协议
文章目录 1. 传输层相关知识1.1 端口号1.2 端口号范围划分1.3 知名端口号1.4 一些相关命令 2. UDP协议2.1 UDP协议格式2.2 UDP协议的特点2.3 什么是面向数据报2.4 UDP的缓冲区2.5 UDP使用注意事项2.6 基于UDP的应用层协议 1. 传输层相关知识 传输层是计算机网络中的一个重要层…...
python制作超高难度走迷宫游戏,你要来挑战嘛~(赶紧收藏)
前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 走迷宫,是一项充满智慧的挑战~ 作为经常刷短视频的我们,见识过不少迷宫小游戏 当然印象深刻的当然是小动物走迷宫 这里有几组挑战走迷宫的小可爱。先来看看吧! (1ÿ…...
springboot整合tio-websocket方案实现简易聊天
写在最前: 常用的http协议是无状态的,且不能主动响应到客户端。最初想实现状态动态跟踪只能用轮询或者其他效率低下的方式,所以引入了websocket协议,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务…...
《TCP IP网络编程》第十三章
第 13 章 多种 I/O 函数 13.1 send & recv 函数 Linux 中的 send & recv: send 函数定义: #include <sys/socket.h> ssize_t send(int sockfd, const void *buf, size_t nbytes, int flags); /* 成功时返回发送的字节数,失败…...
驱动开发 day8 (设备树驱动,按键中断实现led亮灭)
//编译驱动 (注意Makefile的编译到移植到开发板的内核) make archarm //清除编译生成文件 make clean ****************************************** //安装驱动 insmod mycdev.ko //卸载驱动 rmmod mycdev 需要在<内核路径>/arch/arm/boot/dts/ 修改 stm32mp157a-fsm…...
DataX将MySQL数据同步到HDFS中时,空值不处理可以吗
DataX将MySQL数据同步到HDFS中时,空值存到HDFS中时,默认是存储为\N,这样会有两个缺点: 会产生歧义,如果MySQL业务数据中有\N数据,那么存储到HDFS上是\N,null值存储也是\N,当用Hive查…...
P3373 【模板】线段树 2(乘法与加法)(内附封面)
【模板】线段树 2 题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 x x x;将某区间每一个数加上 x x x;求出某区间每一个数的和。 输入格式 第一行包含三个整数 n , q , m n,q,m n,…...
实现langchain-ChatGLM API调用客户端(及未解决的问题)
langchain-ChatGLM是一个基于本地知识库的LLM对话库。其基于text2vec-large-Chinese为Embedding模型,ChatGLM-6B为对话大模型。原项目地址:https://github.com/chatchat-space/langchain-ChatGLM 对于如何本地部署ChatGLM模型,可以参考我之前…...
【AltWalker】模型驱动:轻松实现自动化测试用例的生成和组织执行
目录 模型驱动的自动化测试 优势 操作步骤 什么是AltWalker? 安装AltWalker 检查是否安装了正确的版本 牛刀小试 创建一个测试项目 运行测试 运行效果 在线模型编辑器 VScode扩展 本地部署 包含登录、选择产品、支付、退出登录的模型编写 模型效果 1…...
如何快速掌握LeaguePrank:英雄联盟客户端个性化修改完整指南
如何快速掌握LeaguePrank:英雄联盟客户端个性化修改完整指南 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 想要在英雄联盟客户端中展示独特的个人风格吗?LeaguePrank是一个基于LCU API的英雄联盟客户…...
OpenClaw多任务队列:gemma-3-12b-it并行处理技巧与实践
OpenClaw多任务队列:gemma-3-12b-it并行处理技巧与实践 1. 为什么需要多任务队列 去年冬天,我正尝试用OpenClaw自动化处理一批市场调研报告。当同时提交5个分析任务时,发现系统要么卡死,要么任务相互覆盖。这种经历让我意识到—…...
智慧树网课效率工具:自动化播放与倍速控制插件全解析
智慧树网课效率工具:自动化播放与倍速控制插件全解析 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 在当今在线学习环境中,智慧树作为主流教育…...
GLM-4.1V-9B-Base快速部署:Docker镜像体积优化与启动时间实测对比
GLM-4.1V-9B-Base快速部署:Docker镜像体积优化与启动时间实测对比 1. 模型概述 GLM-4.1V-9B-Base是智谱开源的一款视觉多模态理解模型,专注于图像内容识别与分析任务。该模型具备9B参数规模,在中文视觉理解领域表现出色,能够完成…...
【QuantDev必藏】:为什么92%的C++交易系统仍在用malloc——深度剖析jemalloc/tcmalloc/mimalloc在L3缓存穿透场景下的失效临界点
第一章:金融高频交易系统内存分配的底层挑战与现实困境在纳秒级竞争的金融高频交易(HFT)场景中,内存分配不再是语言运行时的“黑盒服务”,而是决定订单延迟、吞吐一致性与系统可预测性的关键路径。传统堆分配器&#x…...
PDF-Extract-Kit-1.0效果展示:高精度表格识别与公式还原真实案例集
PDF-Extract-Kit-1.0效果展示:高精度表格识别与公式还原真实案例集 想象一下,你手头有一份满是复杂表格和数学公式的PDF学术论文,或者一份财务报告。你需要把里面的数据提取出来,做成Excel表格进行分析,或者把那些复杂…...
SecGPT-14B镜像免配置实战:开箱即用的网络安全大模型推理方案
SecGPT-14B镜像免配置实战:开箱即用的网络安全大模型推理方案 1. 为什么选择SecGPT-14B 在网络安全领域,专业知识的获取往往需要多年经验积累。SecGPT-14B作为一款专注于网络安全的大语言模型,能够为安全工程师、开发人员和IT运维人员提供即…...
【C++27 constexpr革命性突破】:5大新增约束与3类不可逆性能跃迁,资深编译器工程师亲授落地实践
第一章:C27 constexpr革命性突破的底层动因与标准演进全景C27 将首次允许 constexpr 函数完整支持动态内存分配(std::allocator 与 new/delete)、虚函数调用、异常处理(try/catch)及完整 I/O 流子集,其根本…...
终极指南:gin-vue-admin前端错误监控告警配置详解 - 邮件与钉钉实时通知方案
终极指南:gin-vue-admin前端错误监控告警配置详解 - 邮件与钉钉实时通知方案 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理&#…...
OpenClaw自动化周报生成:Qwen2.5-VL-7B图文混合排版实战
OpenClaw自动化周报生成:Qwen2.5-VL-7B图文混合排版实战 1. 为什么需要自动化周报 每周五下午3点,我的日历总会准时弹出"写周报"的提醒。作为一个小团队的Tech Lead,我需要汇总Jira任务进展、Git代码提交、会议纪要等零散信息&am…...
