当前位置: 首页 > news >正文

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

相关阅读

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个字节空间)。

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

相关文章:

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

相关阅读 C语言https://blog.csdn.net/weixin_45791458/category_12423166.html?spm1001.2014.3001.5482 指向数组的指针和指向数组元素的指针常常被混淆,或者笼统地被称为数组指针,但它们之间是有差别的,本文就将对此进行讨论。 下面的代码…...

SQL基础:SQL 介绍和数据库基础

SQL简介 常用的Java等语言是和计算机交流的工具,告诉计算机,让计算机做一些事。 和其类似,SQL是 Structured Query Language 的缩写,即结构化的查询语言,是和数据库交互的工具,即通过既定的一些格式&…...

SpringSecurity入门

前言 Spring Security是一个用于在Java应用程序中提供身份验证和授权功能的强大框架。它构建在Spring框架之上,为开发人员提供了一套灵活且全面的安全性服务,本篇将为大家带来Spring Security的详细介绍及入门 一.安全框架 在学习了解Spring Security之…...

iOS 应用在前台时显示通知

背景: 在iOS应用中,当应用在前台运行时,是不会默认弹出通知的。这是iOS的设计决定,以避免用户在使用应用的过程中被打扰。然而,如果你希望在应用在前台的时候也能收到通知,你可以在你的应用代码中进行一些…...

Hamming space

汉明距离表示两个相同长度字符串对应位置的不同字符的数量。 对两个字符串异或运算,并统计1的个数并相减,这个数就是汉明距离。...

anaconda 安装 使用 pytorch onnx onnxruntime

一:安装 如果不是 x86_64,需要去镜像看对应的版本 安装 Anaconda 输入命令 bash Anaconda3-2021.11-Linux-x86_64.sh 然后输入 yes 表示同意 确认安装的路径,一般直接回车安装在默认的 /home/你的名字/anaconda3 很快就安装完毕。输入 yes…...

Web请求与响应

目录 Postman Postman简介 Postman的使用 请求 简单参数 实体参数 数组参数 集合参数 日期参数 Json参数 路径参数 响应 ResponseBody 统一响应结果 Postman Postman简介 postman是一款功能强大的网页调试与发送网页http请求的Chrome插件,常用于进行…...

ADS学习笔记(一)——更新中

在ADS中,信号上升时间为信号从0~100%所用的时间,而实际上定义的上升边均为10%~90%,所以可以认为上升边=0.8*ADS设置上升时间。 一、终端开路及短路的反射信号 1.仿真条…...

智能优化算法应用:基于冠状病毒群体免疫算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于冠状病毒群体免疫算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于冠状病毒群体免疫算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.冠状病毒群体免疫算法4.…...

小型气象站是什么?

随着科技的发展,我们的生活变得越来越便捷。如今,一款名为小型气象站的新兴设备正在逐渐走进我们的生活,为我们的日常生活增添了更多的便利和舒适。 WX-CQ12小型气象站是一种集成了多种传感器和数据采集技术的智能设备,可以实时监…...

官方指定Jmeter配置JVM堆内存方式

1.概述 在使用Jmeter做性能测试过程中,可能会应为默认设置的堆内存值较小出现堆内存溢出问题,此时解决的方式有两种,分布式测试和调大堆内存。下面介绍官方推荐调整堆内存方法。 2.调整Jmeter堆内存 2.1.介绍官方推荐堆内存调整方法(jmete…...

spark-常用算子

一,Transformation变换/转换算子: 这种变换并不触发提交作业,这种算子是延迟执行的,也就是说从一个RDD转换生成另一个RDD的转换操作不是马上执行,需要等到有Action操作的时候才会真正触发。 1.Value数据类型的Transf…...

《opencv实用探索·二十一》人脸识别

Haar级联分类器 在OpenCV中主要使用了两种特征(即两种方法)进行人脸检测,Haar特征和LBP特征。用的最多的是Haar特征人脸检测。 Haar级联分类器是一种用于目标检测的机器学习方法,它是一种基于机器学习的特征选择方法,…...

前端项目配置下载源npm, yarn,pnpm

前端项目配置下载源 npm: npm config set registry registryhttps://registry.npmmirror.com -g验证: npm config get registry yarn: yarn config set registry registryhttps://registry.npmmirror.com -gyarn config get registryyarn找不到, 需要管理员在命令行: set-exec…...

Elasticsearch之ik中文分词篇

Elasticsearch之ik中文分词篇 ik分词器插件ik分词器安装ik分词模式es ik分词测试 ik分词器插件 es在7.3版本已经支持中文分词,由于中文分词只能支持到单个字进行分词,不够灵活与适配我们平常使用习惯,所以有很多对应中文分词出现&#xff0c…...

2023_Spark_实验三十:测试Flume到Kafka

实验目的:测试Flume采集数据发送到Kafka 实验方法:通过centos7集群测试,将flume采集的数据放到kafka中 实验步骤: 一、 kafka可视化工具介绍 Kafka Tool是一个用于管理和使用Apache Kafka集群的GUI应用程序。 Kafka Tool提供了…...

urllib2 HTTP头部注入

文章目录 注入原理例题 [SWPU 2016]web7 注入原理 参考文章 应用场景是具有SSRF漏洞,结合CRLF注入 我们以redis数据库为例,当存在SSRF时我们伪造以下请求 http://127.0.0.1%0d%0aCONFIG%20SET%20dir%20%2ftmp%0d%0aCONFIG%20SET%20dbfilename%20evil%…...

在 WebRTC 中,Offer/Answer 模型是协商 WebRTC 连接参数的关键部分

在 WebRTC 中,Offer/Answer 模型是协商 WebRTC 连接参数的关键部分。当 Offer 和 Answer 交换失败时,可能涉及到多个原因。以下是一些可能的问题和解决方案: SDP 格式错误: Session Description Protocol(SDP&#xff…...

数据结构:图解手撕B-树以及B树的优化和索引

文章目录 为什么需要引入B-树?B树是什么?B树的插入分析B树和B*树B树B*树分裂原理 B树的应用 本篇总结的内容是B-树 为什么需要引入B-树? 回忆一下前面的搜索结构,有哈希,红黑树,二分…等很多的搜索结构&a…...

useConsole的封装,vue,react,htmlscript标签,通用

之前用了接近hack的方式实现了console的封装,目标是获取console.log函数的执行(调用栈所在位置)所在的代码行数。 例如以下代码,执行window.mylog(1)时候,console.log实际是在匿名的箭头函数()>{//这里执行的} con…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

2025季度云服务器排行榜

在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

C++使用 new 来创建动态数组

问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...