首页 > 其他分享 >二维数组传参和数组指针

二维数组传参和数组指针

时间:2022-12-11 15:32:06浏览次数:43  
标签:传参 arr int 元素 数组 指针

 数组指针

   “数组指针”是一种指针,该指针指向一个数组。就类似于“红苹果”,本质是一种苹果,“红”只是修饰苹果的一个定语。

int arr[5] = { 1,2,3,4,5 };
int(*p)[5] = &arr;//p表示一个指针,存放了一个数组的地址,该数组有5个元素,每个元素是一个整形。

其中p就是一个数组指针,存放着整个数组的地址。需要注意的是,在书写数组指针时必须要将p用()括起来,否则,int* p[5]中p会因为[ ]的结合性更高,而优先与[]进行结合,表示一个五个元素的数组,每个元素是一个指针。也称为指针数组。

二维数组传参

数组方式传参

二维数组传参中最常见的一种方式就是以数组的形式进行传参。

#include<stdio.h>
void print(int brr[3][2], int x, int y)//打印二维数组
{
for (int i = 0; i < x; i++)
{
for (int j = 0; j < y; j++)
{
printf("%d ", brr[i][j]);
}
printf("\n");
}
}
int main()
{
int arr[3][2] = { {1,2},{2,3},{3,4} };//定义一个二维数组
print( arr, 3, 2);
return 0;

}

打印的结果如图:

二维数组传参和数组指针_数组指针


其中,print 函数中的形参就是数组形式,这种数组传参方式也最为常见。

将arr这个数组进行传参,在函数中也只需将函数形参设定为一个数组的形式即可,但需要注意的是,形参中数组的形式必须与传参的数组形式一致,即:所传二维数组是一个三行两列的整形数组,那么形参数组也必须是一个三行两列的数组。

指针方式传参

指针方式传参时我们要应用数组指针。但数组指针多在二维数组中应用,一维数组中应用会显得比较复杂,不方便。

数组指针在一维数组中的应用对比:

#include<stdio.h>
//将指针数组应用于一维数组,会比较复杂,不简单
int main()
{
int arr[5] = { 1,2,3,4,5 };
int(*p)[5] = &arr;//p表示一个指针,存放了一个数组的地址,该数组有5个元素,每个元素是一个整形。
int i ;
for (i = 0; i < 5; i++)
{
printf("%d ", ( * p)[i]);
printf("%d ", *(*p + i));
}
return 0;
}
int main()
{
int arr[5] = { 1,2,3,4,5 };
int i;
for (i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
}
return 0;
}

二维数组传参和数组指针_二维数组_02

  上面两种打印出的结果都是相同的,但在一维数组中应用数组指针,会比较复杂,不简便,不如运用平常一维数组的直接引用方便。

  言归正传,现在我们就来聊聊如何用指针形式进行二维数组的传参。

在传参直接将二维数组名arr传过去的时候,实际穿的是arr[0]的地址,这是第一行所有元素的地址,此时所传的参数是一个数组指针,存放着第一行元素地址,因此形参也必须是数组指针的形式来接收。


#include<stdio.h>
//指针数组进行传参
void print(int(*p)[5],int x,int y)//arr是指arr[0]的地址,arr[0]中又包含有五个元素。
//即arr就是一种数组指针,该指针指向第一行的数组,有五个元素,每个元素是一个整形
//因此形参也用数组指针的形式来表现
{
int i,j;
for (i = 0; i < x; i++)
{
for (j = 0; j < y; j++)
{
printf("%d ", (*(p+i))[j]);//第一种输出方式
//printf("%d ", *((*(p + i) + j)));//第二种输出方式
}
printf("\n");
}
}
int main()
{
int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
print( arr, 3, 5);//arr--数组名--数组首元素地址-在二维数组中首元素是指arr[0],即是指第一行所有元素的地址
return 0;
}

在输出数组时有两种输出方式,第一种*(p+i))[j],p+i是指将p跳过i行,(p+i)是说现在我们拿到了第i行的所有元素地址,(p+i)[j]是输出第i行j列的元素。

第二种 *((p + i) + j)),(*(p + i) + j)则是指拿到了第i行j列的元素地址,在进行一次解引用操作,就可以输出元素本身了。



标签:传参,arr,int,元素,数组,指针
From: https://blog.51cto.com/u_15832077/5928348

相关文章

  • 【Shell脚本(一) -- 开始、变量、字符串、数组】
    一、什么是ShellShell编程就是对一堆Linux命令的逻辑化处理应用例:举个简单的例子,我们做pythonweb开发的,在以前,如果要在本地将程序打包,然后部署到远程服务器(抛开现在的ci,原......
  • 1827. 最少操作使数组递增 ----- 贪心算法
    给你一个整数数组 nums (下标从0开始)。每一次操作中,你可以选择数组中一个元素,并将它增加 1 。比方说,如果 nums=[1,2,3] ,你可以选择增加 nums[1] 得到 nums=......
  • 力扣每日一题2022.12.11---1827. 最少操作使数组递增
    给你一个整数数组 nums (下标从0开始)。每一次操作中,你可以选择数组中一个元素,并将它增加 1 。   比方说,如果 nums=[1,2,3] ,你可以选择增加 nums[1] 得到 n......
  • Blazor和Vue对比学习(进阶.路由导航四):路由传参
    客户端路由传参,主要通过两种方式:(1)路径参数(route),如/student-detial/1,其中/student为路由,1为传递的参数;(2)查询参数(query),如/student-detail?id=1&name=zs&age=18&sex=男。......
  • Java数组学习
    P51什么是数组数组的定义数组是相同类型数据的有序集合数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中每一个数据称作一个数组元素每个数......
  • ATPCS规则 ------ 汇编传参规则
    1、寄存器使用规则ARM处理器中有r0-r15共16个寄存器,它们的用途有一些约定的习惯,并依据这些用途定义了别名,如表所示。项目别名使用规则r15pc程序计数器r14lr......
  • 【C语言】指针运算、指针+-整数、指针-指针、指针的关系运算、标准关系、标准规定、指
    ......
  • JavaScript:this指针
    this指针,存储的是一个内存地址,如同变量一样,指向一块内存区域;而这个内存区域,保存的就是一个对象的数据,那么这个对象是什么呢?通常来说,this指针,主要是用在方法(函数)中,用来指......
  • function~数组逆序存放
    题目描述将一个数组中的值按逆序重新存放。例如,原来的顺序为8,6,5,4,1。要求改为1,4,5,6,8。 输入输入为两行:第一行数组中元素的个数n(1<n<100),第二行是n个整数,每两......
  • c++ l理解智能指针
     智能指针概述C++的指针包括原始指针和智能指针两种,智能指针是原始指针的封装,其优点是可以自动分配内存,无需担心内存的泄露。并不是所有的指针都可以封装为智能指针,很多......