C语言 ——指针数组与数组指针

目录

一、二维数组

二、指针数组

(1)概念

 (2)书写方式

(3)指针数组模拟二维数组

三、数组指针

(1)概念

(2)使用数组指针打印一维数组

 (3)模拟二维数组的传参


一、二维数组

首先,我们要理解一下二维数组和指针变量之间的一些相关概念。

二维数组 :

int arr [ 3 ][ 5 ]  

和一维数组一样,在内存中是一个连续存放的,且每一个元素之前相差的字节是一致的,列如在x86的环境中,二维数组中每一个相邻的元素之间相差4个字节。

不过由于二维数组的特殊性,我们通常把二维数组打印成矩阵形式。

但又和一维数组不同,一维数组的首地址是它首元素的地址,而二维数组的首地址是首行的地址。

二维数组的每一行是一个一维数组,这个一维数组可以看做是二维数组的一个元素。

所以二维数组也可以认为是一维数组的数组。

那么 int arr[3][5] 看成一维数组那么数组名就是 arr[3]。

二、指针数组

(1)概念

首先,指针数组是一个数组,在数组中寄存的是同一类型的指针变量,或者说是地址。

就像整型数组,在整型数组内寄存的是整型的变量,字符数组在字符数组内寄存的是字符类型的变量。

 而指针变量的类型具有很多,int* 、char*、short*…………所以,指针数组也有着许多不同的类型。

 (2)书写方式

int*parr[6]:

parr 数组名

int* 表示的是数组内寄存的地址指向的元素的类型是int,而也使得这些地址的类型也便是int*

[6]表示的是指针数组的大小。

(3)指针数组模拟二维数组

 其中,arr1、arr2、arr3表示的是数组名,而数组名又表示数组首元素的地址,相当于指针。

int * 表示的是指针数组内,那些指针变量的类型。

而因为二维数组的特性,parr[ i ]可以表示为数组名。

而数组名的另一种写法 即为 *(arr+i) 其中arr表示为数组名 ,i表示为遍历。

又因为 parr[ i ] == *( parr + i )

所以parr[ i ][ j ]的另一种写法:*( *(parr+i)+ j ) 其中*(parr+i)为数组名,j为遍历

三、数组指针

(1)概念

首先要认识到,我们之前学习指针数组,指针数组是数组,是存放指针的数组。

数组指针,是指向数组的指针,存放的是数组的地址 。

例如:

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

在此之前,我们先理解一下数组的地址:

通过一维数组的学习,我们得知arr表示的数组名,又表示为数组首元素的地址,而&arr表示的则是整个数组的地址。

随后,紧接着我们的指针知识,我们可以将arr用 int * 进行表示 而&arr则用 int(*)[10]表示。

而如上所示,指针变量p中存储的是整个数组的地址。

(2)使用数组指针打印一维数组

 

 (*p)[ i ] 其中(*p)可以表示为数组名,缘由是&arr = int (*p)[10]  整个数组的地址都交予了指针变量p 相当于p就是&arr 而进行换算 (*p)= (*&arr)其中的*和&是相互抵消的,所以(*p)相当于数组名。

不够以上这种写法并不推荐。

下图的写法更适合大众。

 (3)模拟二维数组的传参

假设:

int arr[3][5] = {{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}};

以上是一个二维数组,当二维数组需要进行调用传参时,我们是需要将它的行数和列数一并进行传参的。

test(arr,3,5)//传参void test (int arr[3][5],int r,int c)//传参调用

而,在使用数组指针进行模拟二维数组传参的同时,我们要明白一个知识。

二维数组的首地址是首行的地址,二维数组是由一维数组组成的。

或者可以说,二维数组的每一行,可以表示为一个一维数组的数组地址。

 随即可以演化为:

int arr0[5] = {1,2,3,4,5};int arr1[5] = {2, 3, 4, 5, 6};int arr2[5] = {3, 4, 5, 6, 7}; int arr3[] = {&arr0, &arr1, &arr2};

&arr0、&arr1、&arr2 分别表示为二维数组arr[ 3 ][ 5 ] 中的每一行的数组地址。

而我们又知道,二维数组arr[ 3 ][ 5 ] 其中arr[ 3 ]相当于一个数组名。

所以,传参调用可以写为:

void test ( int(*arr)[ 5 ], int r, int c )//传参调用

(* arr )[ 5 ] 相当于不久之前的(*p)[ i ],将二维数组的每一行当作一个一维数组,,而arr和p都为整个一维数组的地址,则二者的意思相同。

而不同的是,(* arr )表示的是第一行的地址,在进行打印时需要在内部加上遍历以至于抵达第二行第三行的地址。

所以,*(arr+i) 表示的是数组名,表示arr[ i ][ j ] 中的 arr[ i ] 

而在http://t.csdn.cn/c6Q6H中,我们得知了一种写法,arr[ i ] 可以写为*(arr+i)其中arr表示为数组名。

因此带入到本次模拟中,arr[ i ][ j ]我们可以写为 *(*(arr+i)+ j ) 其中的*(arr+i)和arr[ i ]是数组名。

最后本次二维数组的传参模拟可以写为:

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搭建 Python 环境 | Python、PyCharm

计算机 计算机能完成的工作: 算术运算逻辑判断数据存储网络通信…更多的更复杂的任务 以下这些都可以称为 “计算机”: 一台计算机主要由以下这几个重要的组件构成 CPU 中央处理器:大脑,算术运算,逻辑判断 存储器&…

用PointNet分类3D点云

在本教程中,我们将学习如何训练PointNet进行分类。 我们将主要关注数据和训练过程; 展示如何从头开始编码 Point Net 的教程位于此处。 本教程的代码位于这个Github库中,我们将使用的笔记本位于这个Github库中。 一些代码的灵感来自于这个Git…

MyBatis操作数据库常用用法总结1

文章目录 1.单表查询1.1返回所有的表记录1.2根据id查找结果1.3根据名字查找结果 2.单表修改2.1修改密码 3.单表删除3.1根据id删除信息 4.单表增加(根据业务情况返回)4.1添加返回影响的行数4.2添加返回影响行数和id 5.多表查询(多)…

[考研机试] KY20 完数VS盈数 清华大学复试上机题 C++实现

描述 一个数如果恰好等于它的各因子(该数本身除外)子和,如:6321。则称其为“完数”;若因子之和大于该数,则称其为“盈数”。 求出2到60之间所有“完数”和“盈数”。 输入描述: 题目没有任何输入。 输出描述&#…

CAS服务端入门使用实践

CAS服务端入门使用实践 一、前言 1.简介 CAS 是一个企业多语言单点登录解决方案,支持大量附加身份验证协议和功能,满足身份验证和授权需求的综合平台。 2.环境 Windows 10JDK 1.8git version 2.41.0.windows.3Tomcat 9.0.78Maven 3.5.3cas-overlay-…

ArcGIS在洪水灾害普查、风险评估及淹没制图中应用教程

详情点击链接:ArcGIS在洪水灾害普查、风险评估及淹没制图中应用教程 一:洪水普查技术规范 1.1 全国水旱灾害风险普查实施方案 1.2 洪水风险区划及防治区划编制技术要求 1.3 山丘区中小河流洪水淹没图编制技术要求 二:ArcGIS及数据管理 …

Java集合知识回顾:从分类到工具类,掌握精髓

文章目录 1. 集合的分类2. Collection 接口3. Map 接口4. 泛型5. Collections 工具类总结 在Java编程世界中,集合是一项极为重要的知识,为我们的程序设计提供了强大的数据结构和处理手段。在本篇文章中,我们将回顾集合的分类以及相关的重要概…

74HC595驱动7x11点阵屏(LED-7X11-JHM)DEMO

起因 由于我之前做了一个点阵时钟 ,但是无奈LED点阵屏价格比较贵,所以想找一个价格较为便宜的点阵来做便宜一点的点阵方案,再淘宝上看到有那种五毛钱一个的7x11的LED点阵,所以就想着试试搞一下这种点阵屏,这个由于是7…

阻塞队列的安全实现,定时器的安全实现(面试易考),超详细

一、💛 如何实现一个线程安全的阻塞队列 目前,当前代码是循环队列(还没有进行改动) head和tail的判空判断满两种方法: 1.浪费一个格子,当前走到head的前一个位置,就认为队列满的 2.单独搞一个变量&#xff…

机器学习基础之《特征工程(4)—特征降维》

一、什么是特征降维 降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程 1、降维 降低维度 ndarry 维数:嵌套的层数 0维:标量,具体的数0 1 2 3... …

AAAI论文阅读

文章目录 Open-Vocabulary Multi-Label Classifcation via Multi-Modal Knowledge Transfer——知识蒸馏的范畴Med-EASi: Finely Annotated Dataset and Models for Controllable Simplifcation of Medical Texts——医学领域数据集构建“Nothing Abnormal”: Disambiguating M…

Unity游戏源码分享-植物大战僵尸素材与源码

Unity游戏源码分享-植物大战僵尸素材与源码 完整版本下载地址: https://download.csdn.net/download/Highning0007/88191862