【C语言】指针与数组的潜在联系

目录

前言

改变固有数组的平面思维

注意:

数组操作与指针等价

指针数组

数组指针

笔试加深理解:

        解析:


前言

        《C Traps and Pitfalls》(C语言缺陷与陷阱)中有一句著名的见解:

        “在C语言中,指针与数组这两个概念之间的联系时如此密不可分,以至于如果不能理解一个概念,就无法彻底理解另一个概念。”


改变固有数组的平面思维

        在本质上,C语言只有一维数组,只是数组的元素可以是任意类型的对象,当然也可以是一个数组!于是,这样就产生了高维数组!


        对于:

​int arr[6][4];

        在上图中,arr是一个一维数组,内部含有六个元素;每个元素(arr[0],arr[1]......arr[5])的类型是一个数组类型,假设这个数组(arr[0],arr[1]......arr[5])中的元素   arr[i][j]    是整形,那么这个数组(arr[0],arr[1]......arr[5])的类型是  int (*)[4]  ;

        换句话说:

        这个语句声明的arr是一个数组,该数组拥有6个数组类型的数据,其中每个元素都是一个拥有4个整形元素的数组。(而不是一个拥有4个数组类型的数组,其中每一个元素是一个拥有6个整形元素的数组)

        其实,对于数组arr,它就是一个主串(主数组)上伸出了许多子串(子数组);类似于河流的主流外有许多支流:

        它可以是随意分布的,我们平时为了清晰,我们一般画图将二维数组画成二维棋盘形状。

        我们实际上可以将数组画成任意分布,只要满足C标准: 

 (二维平面不好演示,请自行脑补拖把头每根布的分布)

        其实,我们也可以从数组arr的创建格式上看出端倪:

int arr[6][4];//请重新审视这段代码,以便于加深对他的理解

        这段代码可以翻译为:

        创建一个名字为arr的数组,内部元素为6个  int (*)[4]  类型的数组。其实就是从前到后对这段代码进行翻译。

注意:

         这样一边翻译一边理解的思想是十分重要的,如果不采取这样的思想,那么对于数组指针,指针数组,函数指针,函数指针数组 的理解和区分 将十分困难!

数组操作与指针等价

        对于一个数组,我们只能做两件事:

        确定该数组的大小  以及  获得指向该数组下标为0的元素的指针。

        对于其他有关数组的操作,其实本质上就是指针的操作。也就是说:任何一个数组下标的运算都等同于一个对应指针的运算,因此,指针操作与数组操作是可以相互转化的。

        数组可以看作是一组相邻的内存单元的集合,而指针则是一个指向内存地址的变量。由于数组实际上就是一段连续的内存空间,因此可以使用指针来访问数组中的元素。

        具体来说,可以将数组名看作是一个指向数组第一个元素的指针,即数组名本身就是一个地址。因此,使用指针变量来对数组进行操作就非常方便,如以下示例:

​
int arr[5] = {1, 2, 3, 4, 5};
int *p = arr;   // 将数组名赋值给指针
for (int i = 0; i < 5; i++) {
  printf("%d ", *(p + i));  // 使用指针来访问元素

指针数组

        C语言中的指针数组是指一个数组,其中的每一个元素都是一个指针。这样的数组可以用于存储多个指针,以便对它们进行操作。

        例如,一个指针数组可以用于存储不同类型的指针,如整型指针、字符型指针、结构体指针等:

int *ptrArray[10];     // 整型指针数组,包含10个元素
char *strArray[5];     // 字符型指针数组,包含5个元素
struct person *personArray[100];     // 结构体指针数组,包含100个元素

        可以通过下标来访问数组中的元素,并对其进行操作:

int a = 10, b = 20, c = 30;
int* ptrArray[3] = { &a, &b, &c };

for (int i = 0; i < 3; i++) {
    printf("%d ", *ptrArray[i]);    // 指针数组中的每个元素都是整型指针,需要使用 * 解引用
}

// 输出结果为:10 20 30

数组指针

        在C语言中:

        整形指针变量: int * pint; 存放的是整形变量的地址,能够指向整形数据的指针。
        浮点型指针变量: float * pf; 存放浮点型变量的地址,能够指向浮点型数据的指针。
        那数组指针变量应该是:存放的应该是数组的地址,能够指向数组的指针变量。


        数组指针本质上是一个指针变量,但它可以指向一个数组,从而允许对数组的操作。

由于结合性的问题,数组指针的写法与指针数组的大不相同:

int *p1[10];
int (*p2)[10];

解释:

        1.是前文介绍的指针数组;

        2.p先和*结合,说明p是⼀个指针变量变量,然后指着指向的是⼀个⼤⼩为10个整型的数组。所以
        p是⼀个指针,指向⼀个数组


这里要注意:[ ]的优先级要高于*号的,所以必须加上()来保证p先和*结合。

初始化:

int arr[10] = {0};
int(*p)[10] = &arr;

应用数组的地址初始化数组指针。并且,数组指针p与arr的类型是相同的。

这照应了本文的第一部分,数组指针是高维数组的基础。


        现在有了一定的知识基础,不妨做一些题目检测一下: 

笔试加深理解:

题目1:

​
#include <stdio.h>
int main()
{
int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//#

int *ptr1 = (int *)(&aa + 1);//*

int *ptr2 = (int *)(*(aa + 1));//¥

printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1));//&
return 0;
}

​

        解析:

        #行:

        对数组aa初始化,aa两行五列;

        *行:

        创建整型指针ptr1, 取出aa的地址 +1 后强制类型转化为int*,放入ptr1;

        对数组的地址运算,实际上+1表示跳过整个数组。此时ptr1指向数组紧跟着的一个元素的地址。

        表达式的类型是int (*)[5],强制类型转化后是int*,刚好可以存入ptr1中。

        ¥行:

        aa+1 中的aa表示数组首元素的地址,是  int aa[0] 的地址, 这一点很重要——这第三次照应了数组aa是一维数组,每一个元素也是一个数组,那么aa中的每一个元素都是数组类型,而不是aa中的元素类型是int型。

        aa + 1 表示指向第二行,存放的是第二行的地址,表示第二行的首元素地址。

        &行:打印*(ptr1-1),即数组最后一个元素;打印*(ptr2-1),即第二行前的一个元素。

结果:


完~

未经作者同意禁止转载 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Netty核心知识总结

Netty是一个高性能、异步事件驱动的NIO框架&#xff0c;它提供了对TCP、UDP和文件传输的支持&#xff0c;作为一个异步NIO框架&#xff0c;Netty的所有IO操作都是异步非阻塞的&#xff0c;通过Future-Listener机制&#xff0c;用户可以方便的主动获取或者通过通知机制获得IO操作…

ElasticSearch篇---第三篇

系列文章目录 文章目录 系列文章目录前言一、了解ElasticSearch 深翻页的问题及解决吗?二、熟悉ElasticSearch 性能优化三、ElasticSearch 查询优化手段有哪些?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这…

Linux 和 macOS 的主要区别在哪几个方面呢?

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

【信息安全】-个人敏感信息、个人信息、个人金融信息

文章目录 个人敏感信息个人敏感信息判定举例 个人信息个人信息判定举例 个人金融信息内容a) 账户信息指账户及账户相关信息b) 鉴别信息c) 金融交易信息d) 个人身份信息e) 财产信息f) 借贷信息g) 其他信息: 出处 个人敏感信息 个人敏感信息判定 个人敏感信息是指一旦泄露、非法…

ppt转换成pdf文件

最近用到了&#xff0c;记一下&#xff1b; ppt转pdf分为两种情况: 小于2007版本的 .ppt格式&#xff08;2003&#xff09; 与大于2007版本的 .pptx格式&#xff08;2007&#xff09; .ppt格式为 二进制文件 .pptx格式为xml格式&#xff0c;在java中有不同的jar包需要使用 引入…

MyBatis 常见面试题

目录 1.MyBatis——概述1.1.什么是 ORM 框架&#xff1f;1.2.✨谈谈对 MyBatis 的理解。1.3.使用 MyBatis 相对于直接使用 SQL 有哪些优点&#xff1f;1.4.MyBatis 有什么优缺点&#xff1f;1.5.✨MyBatis 的分层结构是什么样的&#xff1f;1.6.✨MyBatis 的执行流程是什么样的…

这个柴油发电机大招,再不知道就晚了!

随着能源需求的不断增长和环境问题的日益凸显&#xff0c;柴油发电机在各个行业中扮演着关键的角色&#xff0c;为企业和社会提供可靠的电力支持。 然而&#xff0c;为了确保发电机的高效运行和延长其使用寿命&#xff0c;监控和维护变得至关重要。 客户案例 制造业 某制造业…

Java 控制台命令导入本地jar包到maven本地库中

1、新建POM文件&#xff0c;在maven库路径下创建POM文件 注意&#xff1a;这个路径需要与第2点导入命令中的grouoId、artifactId和version写法对应 Path&#xff1a;D:\RomanData\repository\com\sae\mail\1.0.0\mail-1.0.0.pom <?xml version"1.0" encoding&q…

电脑屏幕亮度怎么调?学会4个方法,轻松调节亮度!

“我总是感觉我电脑屏幕太暗了&#xff0c;有时候如果光线好一点&#xff0c;会看不清电脑屏幕。有什么可以把电脑调亮一点的简单方法吗&#xff1f;” 在我们的日常生活中&#xff0c;电脑已经成为我们工作、学习、娱乐不可或缺的工具。然而&#xff0c;长时间面对电脑屏幕可能…

删除误提交的 git commit

背景描述 某次的意外 commit 中误将密码写到代码中并且 push 到了 remote repo 里面, 本文将围绕这个场景讨论如何弥补. 模拟误提交操作 在 Gitee 创建一个新的 Repo, clone 到本地 git clone https://gitee.com/lpwm/myrepo.git创建两个文件, commit 后 push 到 remote 作…

2022年第十一届数学建模国际赛小美赛B题序列的遗传过程解题全过程文档及程序

2022年第十一届数学建模国际赛小美赛 B题 序列的遗传过程 原题再现&#xff1a; 序列同源性是指DNA、RNA或蛋白质序列之间的生物同源性&#xff0c;根据生命进化史中的共同祖先定义[1]。DNA、RNA或蛋白质之间的同源性通常根据它们的核苷酸或氨基酸序列相似性来推断。显著的相…

【EI征稿中|SPIE出版】 第四届传感器与信息技术国际学术会议(ICSI 2024)

第四届传感器与信息技术国际学术会议&#xff08;ICSI 2024&#xff09; 2024 4th International Conference on Sensors and Information Technology&#xff08;ICSI 2024&#xff09; 第四届传感器与信息技术国际学术会议&#xff08;ICSI 2024&#xff09;将于2024年1月5…

VS2019shi用动态链接库

.dll文件路径包含 C/C常规-------->附加包含目录 将动态库项目文件路径包含在附加包含目录。 .lib文件路径包含 连接器------------>输入------------------>附加依赖项 .lib文件名字输出附加依赖项 连接器------------>常规------------------>附加库目录 添加…

软著项目推荐 深度学习的水果识别 opencv python

文章目录 0 前言2 开发简介3 识别原理3.1 传统图像识别原理3.2 深度学习水果识别 4 数据集5 部分关键代码5.1 处理训练集的数据结构5.2 模型网络结构5.3 训练模型 6 识别效果7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习…

外包干了8个月,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

开源代驾上门预约小程序源码系统:预约代驾,出行更无忧 附带完整的搭建教程

随着人们生活水平的提高&#xff0c;越来越多的人选择代驾服务。为了方便用户预约代驾&#xff0c;罗峰来给大家分享一款开源代驾上门预约系统。该系统具有以下特色功能&#xff0c;让出行更加无忧。 以下是部分代码示例&#xff1a; 系统特色功能一览&#xff1a;​​​​​​…

【计算机网络笔记】物理层——信道与信道容量

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

理解依赖注入

1 回顾Spring IoC容器 1.1 Spring IoC容器 Web应用程序由大量的程序组件组成&#xff0c;这些组件一起工作完成业务逻辑的执行。 这些组件通常是一个依赖另一个&#xff0c;互相协作实现所需功能。 Spring提供容器&#xff0c;也就是IoC容器&#xff0c;来管理这些组件&…

万界星空科技MES系统在工业生产中的应用

万界星空科技MES系统在工业生产中的应用广泛。它适用于各类制造业&#xff0c;包括汽车制造、电子制造、注塑、能源化工、航天航空、食品加工、服装纺织、灯具、电线电缆、电机发动机、印刷包装等行业。 在汽车制造领域&#xff0c;MES系统可以实时追踪和控制整个生产过程&…

摄像头选型号指南

镜头选型工具 - HiTools - 海康威视 Hikvisionhttps://www.hikvision.com/cn/support/tools/hitools/cl8a9de13648c56d7f/ 1. 海康威视摄像头选型号指南 海康威视摄像头选型号指南-CSDN博客文章浏览阅读3.7k次。跟客服对话比跟AI对话好不了多少&#xff0c;能噎死人&#xff0…