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

news/2024/10/20 18:55:50/

目录

一、二维数组

二、指针数组

(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.ppmy.cn/news/1026252.html

相关文章

Vision Transformer模型入门

Vision Transformer模型入门 一、Vision Transformer 模型1,Embedding 层结构详解2,Transformer Encoder 详解3,MLP Head 详解 二、ViT-B/16 网络结构三、Hybrid 模型详解四、ViT 模型搭建参数 一、Vision Transformer 模型 总体三个模块&am…

实现语音识别系统:手把手教你使用STM32C8T6和LD3320(SPI通信版)实现语音识别

本文实际是对LD3320(SPI通信版)的个人理解,如果单论代码和开发板的资料而言,其实当你购买LD3320的时候,卖家已然提供了很多资料。我在大学期间曾经多次使用LD3320芯片的开发板用于设计系统,我在我的毕业设计…

基于机器学习进行降雨预测 -- 机器学习项目基础篇(13)

在本文中,我们将学习如何构建一个机器学习模型,该模型可以根据一些大气因素预测今天是否会有降雨。这个问题与使用机器学习的降雨预测有关,因为机器学习模型往往在以前已知的任务上表现得更好,而这些任务需要高技能的个人来完成。…

Vue+SpringBoot项目开发:后台登陆功能的实现(二)

写在开始:一个搬砖程序员的随缘记录文章目录 一、SpringBoot项目的搭建二、数据库配置1、新建数据库2、新建用户表 三、SpringBoot项目的配置 一、SpringBoot项目的搭建 项目搭建传送门:从零开始,SpringBoot项目快速搭建 二、数据库配置 1、新建数据库…

1、Java简介+DOS命令+编译运行+一个简单的Java程序

Java类型: JavaSE 标准版:以前称为J2SE JavaEE 企业版:包括技术有:Servlet、Jsp,以前称为J2EE JavaME 微型版:以前称为J2ME Java应用: Android平台应用。 大数据平台开发:Hadoo…

el-tree-select那些事

下拉菜单树形选择器 用于记录工作及日常学习涉及到的一些需求和问题 vue3 el-tree-select那些事 1、获取el-tree-select选中的任意层级的节点对象 1、获取el-tree-select选中的任意层级的节点对象 1-1数据集 1-2画面 1-3代码 1-3-1画面代码 <el-tree-selectv-model"s…

Python 11道字典练习题

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 有字典 dic {“k1”: “v1”, “k2”: “v2”, “k3”: “v3”}&#xff0c;实现以下功能&#xff1a; 1、遍历字典 dic 中所有的key 参考答案&#xff1a; dic {k1: v1,k2:v2,k3:v3}for k in dic.keys():print(k)2、遍历…

dji uav建图导航系列(二)导航

文章目录 1、导航节点launch文件1.1、节点参数1.2、模拟器节点1.3、无人机雷达-底盘节点1.4、地图服务器节点1.5、AMCL节点1.6、move_base节点1.7、rviz可视化节点2、导航测试2.1、导航实测2.2、动态参数配置 rqt_reconfigure1、导航节点launch文件 导航节点启动文件 uav_navi…