C语言:指向数组的指针和指向数组元素的指针

news2024/12/23 17:24:03

相关阅读

C语言icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12423166.html?spm=1001.2014.3001.5482


        指向数组的指针和指向数组元素的指针常常被混淆,或者笼统地被称为数组指针,但它们之间是有差别的,本文就将对此进行讨论。

        下面的代码首先创建了一个数组,然后创建了指向该数组的指针和指向该数组首元素的指针。

int arr[] = {0,1,2};
int *ptr0 = arr;     //创建了一个int型指针,指针值为数组首元素地址
int *ptr1 = &arr[0]; //创建了一个int型指针,指针值为数组首元素地址
int (*ptr2) = &arr;  //创建了一个int型数组指针,指针值为整个数组的地址

        上面的三个指针,其实指针值都是一样的,即三个常量arr==&arr[0]==&arr(尽管这看起来有点奇怪),那他们有什么区别呢?

  • &arr[0]与arr对于编译器来说没有任何区别,因此ptr0和ptr1两个指针的各种性质都是一样的。
  • &arr这个常量值虽然与其他两者相同,但是对编译器而言,它代表了整个数组的地址,因此当&arr与其他数加减时,会将其他数转化为以数组的字节数为单位的地址值,对于指针ptr2来说也是如此。
int arr[] = {0,1,2};
//下面两条语句等价
int *ptr0 = arr;      //创建了一个int型指针,指针值为数组首元素地址
int *ptr1 = &arr[0];  //创建了一个int型指针,指针值为数组首元素地址
int (*ptr2) [3] = &arr; //创建了一个int型数组指针,指针值为整个数组的地址
 
printf("arr is %p\n", arr);
printf("arr + 1 is %p\n", arr + 1);
printf("&arr[0] is %p\n", &arr[0]);
printf("&arr[0] + 1 is %p\n", &arr[0] + 1);
printf("&arr is %p\n", &arr);
printf("&arr + 1 is %p\n", &arr + 1);
 
printf("ptr0 is %p\n", ptr0);
printf("ptr0 + 1 is %p\n", ptr0 + 1);
printf("ptr1 is %p\n", ptr1);
printf("ptr1 + 1 is %p\n", ptr1 + 1);
printf("ptr2 is %p\n", ptr2);
printf("ptr2 + 1 is %p\n", ptr2 + 1);
 
输出:
arr is         000000000061FDFC
arr + 1 is     000000000061FE00
&arr[0] is     000000000061FDFC
&arr[0] + 1 is 000000000061FE00
&arr is        000000000061FDFC
&arr + 1 is    000000000061FE08
ptr0 is        000000000061FDFC
ptr0 + 1 is    000000000061FE00
ptr1 is        000000000061FDFC
ptr1 + 1 is    000000000061FE00
ptr2 is        000000000061FDFC
ptr2 + 1 is    000000000061FE08

         可以看到arr、&arr[0]、&arr、ptr0、ptr1、ptr2的值都是相同的,但是arr、&arr[0]、ptr0、ptr1加1在编译后对地址值加了4,因为int类型占4字节的空间;&arr、ptr2加1在编译后对地址值加了12,因为数组含有三个int类型的数据,因此数组占12字节的空间。

        指向数组的指针在使用多维数组时常见,如下所示。

int arr[2][2] = {{0,1},{2,3}}; //创建一个多维数组

int (*ptr0) [2][2] = &arr; //创建了一个int型二维数组指针,指针值为二维数组的地址 
//下面两条语句等价
int (*ptr1) [2] = arr;     //创建了一个int型一维数组指针,指针值为两个数组中第一个数组的地址 
int (*ptr2) [2] = &arr[0]; //创建了一个int型一维数组指针,指针值为两个数组中第一个数组的地址
int *ptr3 = arr[0];        //创建了一个int型指针,指针值为两个数组中第一个数组的首元素地址
int *ptr4 = &arr[0][0];    //创建了一个int型指针,指针值为两个数组中第一个数组的首元素地址



printf("ptr0 is %p\n", ptr0);
printf("ptr0 + 1 is %p\n", ptr0 + 1);
printf("ptr1 is %p\n", &arr[0]);
printf("ptr1 + 1 is %p\n", ptr1 + 1);
printf("ptr2 is %p\n", ptr2);
printf("ptr2 + 1 is %p\n", ptr2 + 1);
printf("ptr3 is %p\n", ptr3);
printf("ptr3 + 1 is %p\n", ptr3 + 1);
printf("ptr4 is %p\n", ptr4);
printf("ptr4+ 1 is %p\n", ptr4 + 1);

输出:
ptr0 is     000000000061FDE0
ptr0 + 1 is 000000000061FDF0
ptr1 is     000000000061FDE0
ptr1 + 1 is 000000000061FDE8
ptr2 is     000000000061FDE0
ptr2 + 1 is 000000000061FDE8
ptr3 is     000000000061FDE0
ptr3 + 1 is 000000000061FDE4
ptr4 is     000000000061FDE0
ptr4+ 1 is  000000000061FDE4

        可以看到,即使ptr0、ptr1、ptr2、ptr3的值都是一样的,ptr0+1在编译后对地址值加了16(二维数组占4个字节空间),ptr1+1和ptr2+1在编译后对地址值加了8(一维数组占8个字节空间),ptr3+1在编译后对地址值加了4(int类型占4个字节空间)。

        相信通过本文,读者应该对指向数组的指针和指向数组元素的指针有了充分的认识,并可以在之后的编程中得心应手的运用指针了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1308384.html

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

相关文章

IPO:“动储结合”抢占储能先机后,瑞浦兰钧如何继续赢?

在全球新能源汽车的推动下,锂电池赛道早已拥挤不堪,作为入局较晚的后起之秀,从2017年成立到首次实现锂电池的批量交付,瑞浦兰钧能源股份有限公司(以下简称“瑞浦兰钧”)仅用了2年不到的时间。2022年&#x…

如何通过TortoiseGit可视化工具查看Git管理的版本树和信息(工作树变更)内容

一、版本树 黑色直线:master分支和基于master分支拉取基础分支都在这条线上,是一条直线。 其他线条:新开分支一定会增加一条线,但不一定每一条线分别代表一个分支。 注:如果一直是一个人,在同一个本地分支…

解决GateWay报错:Exceeded limit on max bytes to buffer : 262144

场景: 前端传来了一个大的字符串 发现请求不通 一番调试发现SpringGateway 默认内存缓冲区262144字节 网上查了很多种常见的解决方案无效之后 直接重写底层 网友的解决方案 方案1(无效) 直接修改缓冲区大小 spring:codec:max-in-memory-s…

Apache OfBiz 反序列化命令执行漏洞(CVE-2023-49070)

项目介绍 Apache OFBiz是一个非常著名的电子商务平台,是一个非常著名的开源项目,提供了创建基于最新J2EE/XML规范和技术标准,构建大中型企业级、跨平台、跨数据库、跨应用服务器的多层、分布式电子商务类WEB应用系统的框架。OFBiz最主要的特…

Shopify模版二次开发 Liquid实现响应式无缝跑马灯效果

1、HTML 代码结构 要实现无缝&#xff0c;我们需要复制出文案结构放在后面 <div class"marquee__wrapper"><div class"marquee"><div class"marquee__content"><p>有人知道在 Shopify 中使用media 的正确方法吗&#x…

数据链路层的作用和三个基本问题

目录 一. 数据链路层的作用二. 数据链路层解决的三个问题2.1 数据链路和帧2.2 三个基本问题(重要)2.2.1 封装成帧2.2.2 透明传输2.2.3 差错检测 \quad 一. 数据链路层的作用 \quad \quad \quad 光有链路不能传输数据, 还要加上协议, 这样才是数据链路 数据链路层的作用就是负责…

CVPR 2023 三维重建相关必读论文和代码合集

三维重建涉及将二维图像或视频转换为三维模型的过程&#xff0c;这个过程需要应用到多门学科的知识&#xff0c;比如数学、计算机图形学和多视图几何等&#xff0c;学习门槛较高。但尽管如此&#xff0c;三维重建仍然是CV领域的一个热门方向。 目前三维重建技术已经有了广泛应…

基于YOLOv8深度学习的吸烟/抽烟行为检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

桥梁巡查管理二维码

随着互联网世界的发展&#xff0c;二维码随处可见。二维码已经融入到我们生活的各个方面&#xff0c;不管是买东西&#xff0c;还是参观展览&#xff0c;甚至当我们走在路上&#xff0c;路牌上都会有二维码。甚至很多桥梁都用二维码来管理。 使用二维码管理桥梁能实现哪些功能…

有监督学习、无监督学习、半监督学习和强化学习

有监督学习 训练数据有标签 无监督学习 数据是没有标签的 聚类的思想&#xff1a;通过计算空间中的距离来判断是否属于同一类 强化学习 和环境交互&#xff0c;从环境中学习 三者对比 半监督学习 少量有标注&#xff0c;大量无标注 三个假设 1.连续性/平滑性假设:相…

肥猫游戏报价器|计价器|王者荣耀代练陪练等游戏报价器软件介绍说明

目录 1. 前言2. 软件著作权3. 软件使用说明3.1 进入软件3.2 用户登录3.3 首页3.4 报价器3.4.1 总体介绍3.4.2 王者报价器3.4.3 LOL手游报价器3.4.4 英雄联盟报价器3.4.5 云顶之弈报价器3.4.7 王者水晶报价器3.4.8 和平精英报价器3.4.9 蛋仔派对报价器3.4.10 穿越火线报价器3.4.…

验证栈序列(栈压入、弹出序列),剑指offer,力扣

目录 题目地址&#xff1a; 相同题型&#xff1a; 我们直接看题解吧&#xff1a; 解题方法&#xff1a; 审题目事例提示&#xff1a; 解题分析&#xff1a; 解题思路&#xff1a; 代码实现&#xff1a; 题目地址&#xff1a; 946. 验证栈序列 - 力扣&#xff08;LeetCode&#…

想入门Web测试,看这篇文章!

今天要谈的是很多软件测试工程师都需要面对的——Web测试 不管你是处在二十不惑的青春有你阶段还是三十而已的乘风破浪阶段我们都需要面对“Web测试”。 Web测试其实有以下几个方面&#xff1a; 1、页面测试 大多数的Web网站的网页都是html语言编写的&#xff0c;测试工程师…

网络基础(九):VLAN的概述及配置

目录 前言 一、分割广播域的方法 二、VLAN 1、VLAN的概述及优势 1.1VLAN的概述 1.2VLAN的优势 2、VLAN的种类 3、VLAN的三种端口类型 4、VLAN 的工作原理 4.1VLAN数据帧 4.2VLAN的范围 4.2VLAN的access类型工作原理 4.3VLAN的trunk类型工作原理 4.4VLAN的Hybird类…

算法中的最优化方法课程复习

算法中的最优化方法课程复习 单模函数、拟凸函数、凸函数证明证明一个线性函数与一个凸函数的和也是凸的 梯度线性规划标准形式以及如何标准化标准形式常见标准化方法线性化技巧 单纯形法二次规划无约束优化Nelder-Mead线搜索FR共轭梯度法例题 优化算法的选择、停止准则算法选择…

主动学习与弱监督学习

人工智能数据的获取没有想象中的那么简单&#xff0c;虽然我们早已身处大数据的浪潮下&#xff0c;很多公司在获取数据的大浪中翻滚却始终没有找到一个合适的获取数据的渠道。很多情况下&#xff0c;获取高质量的人工智能数据需要消耗大量的人力、时间、金钱&#xff0c;但是对…

Py之scikit-surprise:scikit-surprise的简介、安装、使用方法之详细攻略

Py之scikit-surprise&#xff1a;scikit-surprise的简介、安装、使用方法之详细攻略 目录 scikit-surprise的简介 1、基准测试 Movielens 100k Movielens 1M scikit-surprise的安装 scikit-surprise的使用方法 1、基础用法 (1)、简单的示例&#xff0c;展示如何&#x…

分类预测 | Matlab实现HPO-GRU【23年新算法】基于猎食者优化算法优化门控循环单元的数据分类预测

分类预测 | Matlab实现DBO-SVM蜣螂算法优化支持向量机的数据分类预测【23年新算法】 目录 分类预测 | Matlab实现DBO-SVM蜣螂算法优化支持向量机的数据分类预测【23年新算法】分类效果基本描述程序设计参考资料 分类效果 基本描述 1.HPO-GRU【23年新算法】基于猎食者优化算法优…

生物燃料市场分析:预计2029年将达到1968亿美元

生物燃料(biofuel)泛指由生物质组成或萃取的固体、液体或气体燃料&#xff0c;可以替代由石油制取的汽油和柴油&#xff0c;是可再生能源开发利用的重要方向。所谓的生物质是指利用大气、水、土地等通过光合作用而产生的各种有机体&#xff0c;即一切有生命的可以生长的有机物质…

配置文件中的$和@

配置文件中的$和 0、前言 借鉴文章&#xff1a; https://blog.csdn.net/Saintmm/article/details/124603343 https://blog.csdn.net/ster_ben/article/details/119295815在yml配置文件中&#xff0c;可以使用${}和{}来引用其他配置项的值作为配置项的值。 spring:applicati…