(一维、二维)数组传参,(一级、二级)指针传参【含样例分析,新手易懂】

news2025/7/14 11:32:18

目录

  • 数组传参
      • 一维数组传参
      • 二维数组传参
  • 指针传参
      • 一级指针传参
      • 二级指针传参

我们在写代码的时候难免要把数组或者指针传给函数,那函数的参数该如何设计呢?

数组传参

一维数组传参

我们首先来看下面代码的几个例子:

#include <stdio.h>
void test(int arr[])//ok?--Yes
{}
void test(int arr[10])//ok?--Yes
{}
void test(int* arr)//ok?--Yes
{}
void test2(int* arr[20])//ok?--Yes
{}
void test2(int** arr)//ok?--Yes
{}
int main()
{
 int arr[10] = {0};
 int* arr2[20] = {0};
 test(arr);
 test2(arr2);

🚩首先来看test(arr);
看看它的函数参数可以怎么写?

因为test(arr);传过去的是数组,所以上面的void test( ){}也可以用数组接收,
即写成void test(int arr[]){}
当然[]里可以写数组大小,也可以不写,里面的数字对语法没任何影响,所以我们还可以写做void test(int arr[10]){}void test(int arr[30]){}(当然这样写30,虽然语法正确,但没任何意义)
上面的写法即是数组传参,形参写成数组的形式

我们知道,数组传参本质上传过去的是数组首元素的地址,所以参数部分我们就可以写成指针了
我们来分析一下
test(arr);数组名arr是首元素的地址, int arr[10] = {0};可以看出每个元素的类型是int类型。
test(arr);传过去的是首元素的地址,首元素的地址是一个int类型的元素的地址,int类型元素的地址如果要用指针来接收,那就该用int类型指针来接收,所以可以写成void test(int* arr){}

🚩接下来我们来看 test2(arr2);
数组传过来,用数组接收,写做void test2(int* arr[20]){}以及void test2(int* arr[]){},原理同上面的test(arr);
那数组传参写成指针又怎么写呢?
数组传参本质上传过去的是数组首元素的地址, int* arr2[20] = {0};可以看出,首元素类型为int*,即每个元素都是个整型指针,所以int*类型元素的地址如果要用指针来接收,那就该用int*类型指针来接收,即一级指针地址传过去,就需要用二级指针来接收,所以可以写成void test(int** arr){}

二维数组传参

同样,我们首先来看下面代码的几个例子:

void test(int arr[3][5])//ok?--Yes
{}
void test(int arr[][])//ok?--No
{}
void test(int arr[][5])//ok?--Yes
{}
//总结:二维数组传参,函数形参的设计只能省略第一个[]的数字。
//因为对一个二维数组,可以不知道有多少行,但是必须知道一行多少元素。
//这样才方便运算。
void test(int* arr)//ok?--No
{}
void test(int* arr[5])//ok?--No//int* arr[5]是指针数组 根本不沾边
{}
void test(int (*arr)[5])//ok?--Yes
{}
void test(int** arr)//ok?--No
{}
int main()
{
 int arr[3][5] = {0};
 test(arr);
}

有前面的分析,很容易知道可以这样写void test(int arr[3][5]){}
二维数组传参,函数形参的设计只能省略第一个[]的数字,即行可以省略,列不能省略。
因为对一个二维数组,可以不知道有多少行,但是必须知道一行多少元素。
这样才方便运算。
所以void test(int arr[][]){}这样写不行,
应该void test(int arr[][5]){}这样写。
我们要知道,当我们谈二维数组首元素地址的时候,指的是它的第一行
在这里插入图片描述
对于arr[3][5]这个数组,本质上是这样的,arr有三个元素,每个元素是(有五个整型元素的)一维数组,我们说数组名表示首元素的地址,即第一行一维数组的地址,一维数组的地址就要用指向一维数组的指针来存放,即写成void test(int (*arr)[5]){}数组指针的形式。
解释:arr是个指针,指向的是5个元素的数组,元素类型为int,(说明一下,(*arr)如果不加(),则arr会优先跟[5]结合,因为[]优先级更高)
不懂为什么这么写的可以去看这篇博客数组指针(用几个例子来看看用法)【点击即可跳转】
有人肯定在想,二维数组用二级指针可以吗?即void test(int **arr){}//ok?–No,当然不行啦,虽然它们都带有“二”,但二维数组和二级指针没有任何关系噢
void test(int* arr)可以吗?也不行。二维数组名传过去的实际上是第一行一维数组的地址,这里就肯定不能用一个整型指针int* arr来接收(要用数组指针),整型指针是用来存放整型变量地址的。
在这里插入图片描述

指针传参

一级指针传参

int main()
{
 int arr[10] = {1,2,3,4,5,6,7,8,9};
 int *p = arr;
 int sz = sizeof(arr)/sizeof(arr[0]);
 //一级指针p,传给函数
 print(p, sz);
 return 0;
}

对于 print(p, sz);我们传参,函数print()的形参部分应该怎么写呢?
答案如下

void print(int *p, int sz)

我们要打印出来arr的元素,则整段代码为

#include <stdio.h>
void print(int *p, int sz)
{
 int i = 0;
 for(i=0; i<sz; i++)
 {
 printf("%d\n", *(p+i));
 }
}
int main()
{
 int arr[10] = {1,2,3,4,5,6,7,8,9};
 int *p = arr;
 int sz = sizeof(arr)/sizeof(arr[0]);
 //一级指针p,传给函数
 print(p, sz);
 return 0;
}

有人肯定会问,一级指针用一维数组传可以吗?
即写成

void print(int p[], int sz)

运行一下
在这里插入图片描述

答案是:可以的。毕竟一维数组的本质还是指针。但是不建议这样写,还是对应写成指针的形式比较好,一级指针传过去就用一级指针接收比较好。
Alt
那接着我们思考一下
当一个函数的参数部分为一级指针的时候,函数能接收什么参数?
比如:

void test1(int *p)
{}

test1函数能接收什么参数?

void test1(int* p)
{}
int main()
{
	int a;
	test1(&a);//整型的地址放到整型的指针里去,当然是可以的
}

还能怎样写?

void test1(int* p)
{}
int main()
{
	int arr[10] = { 0 };
	test1(arr);
}

数组名代表首元素地址,arr元素是int型的,所以对应上面int* p也是可以的。
当然,直接传一级指针过去也是可以的

void test1(int* p)
{}
int main()
{
	int a;
	int* p1 = &a;
	test1(p1);
}

二级指针传参

对于下面

int main()
{
 int n = 10;
 int*p = &n;
 int **pp = &p;
 test(pp);//传的是二级指针变量
 return 0;
}

test(pp);传的是二级指针变量,那就用二级指针接收。

 #include <stdio.h>
void test(int** ptr)
{
 printf("num = %d\n", **ptr); 
}
int main()
{
 int n = 10;
 int*p = &n;
 int **pp = &p;
 test(pp);
 return 0;
}

Alt
思考一下,当函数的参数为二级指针的时候,可以接收什么参数?
比如:

void test(int** ptr)
{}

test函数能接收什么参数?
当然还可以这样:

#include <stdio.h>
void test(int** ptr)
{
 printf("num = %d\n", **ptr); 
}
int main()
{
 int n = 10;
 int*p = &n;
 int **pp = &p;
 //test(pp);
 test(&p);//一级指针变量的地址取出来放到二级指针里面去
 return 0;
}

当然还可以这样:

#include <stdio.h>
void test(int** ptr)
{
 printf("num = %d\n", **ptr); 
}
int main()
{
	int* arr[10] = {0};
	test1(arr);
}

arr数组的元素类型是int*,数组名arr代表数组首元素的地址,即int*的地址,那么就可以放到二级指针里面去。即指针数组的数组名可以传过去。
在这里插入图片描述

以上就是我总结的关于"数组传参,指针传参"的相关内容
如果对你有帮助,别忘了点赞👍+收藏
欢迎大家的指导
我的主页还有其他内容,关注❤我,我们一起学习一起成长!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

优化长尾关键词有什么好处?在线长尾关键词挖掘

​想知道为什么要使用长尾关键词&#xff1f; 好吧&#xff0c;它们可以帮助你轻松找到合适的受众。 ​ 1.获得更高的转化率 长尾关键词对于搜索特定信息更有用。使用长尾关键词时通常会获得更高的转化率&#xff0c;因为内容与受众的需求更相关。 举个例子&#xff1a;你正…

3年测试拿8K,被校招来的实习生反超薪资,其实你在假装努力

最近朋友给我分享了一个他公司发生的事 大概的内容呢&#xff1a;公司一位工作3年的测试工资还没有新人高&#xff0c;对此怨气不小&#xff0c;她来公司辛辛苦苦三年&#xff0c;三年内迟到次数都不超过5次&#xff0c;每天都是按时上下班&#xff0c;工作也按量完成&#xf…

【华为OD机试模拟题】用 C++ 实现 - 最低位排序(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 货币单位换算(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 选座位(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 停车场最大距离(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 重组字符串(2023.Q1) 【华为OD机试模…

结构效度分析流程

结构效度分析流程如下图 一、结构效度的意义 效度分析在学术研究中非常常见&#xff0c;结构效度是为了分析“从量表获得的结果与设计该量表时所假定的理论之间的符合程度”。简单来讲&#xff0c;在研究者设计量表之初&#xff0c;一般会预设好几个维度&#xff0c;在经过因子…

docker搭建MySQL集群(1主1从)

1.创建挂载路径及配置文件my.cnf&#xff0c;挂载mysql的数据、配置、日志 /usr/mydata/mysql/conf/s1 /usr/mydata/mysql/conf/m1my.cnf先只写server-id,保证主从不同 2.拉取MySQL镜像&#xff0c;启动两个实例 docker run -p 3316:3306 --name mysql-m1 -v /usr/mydata/m…

识别密文加密类型

离线密码破解&#xff1a;离线不会触发密码锁定机制不会产生大量登录失败日志引起管理员注意HASH识别工具&#xff08;识别哈希类型&#xff09;&#xff1a;hash-identifierHashid yara规则匹配文件得到特定加密算法一、hash-identifierKali Linux提供工具hash-identifier来识…

LabVIEW如何调用.m脚本LabVIEW调用MATLAB

LabVIEW如何调用.m脚本LabVIEW调用MATLAB有一个用MATLAB编写的脚本&#xff0c;想知道从LabVIEW调用它的方法&#xff0c;以及哪一个是最快的。解决方法有几种方法可以在LabVIEW中调用.m脚本。LabVIEW中的MATLABScript Node使用ActiveX调用MATLAB运行时系统。注意&#xff1a;不…

Nginx 02篇——Nginx基本配置与参数说明篇

Nginx 02篇——Nginx基本配置与参数说明篇前言-默认配置文件1. 前言——关于nginx1.1 关于nginx1. 2 Nginx 01篇——Nginx安装2. Nginx 配置文件结构2.1 Nginx 安装后的默认文件2.2 Nginx 的三大组成部分3. 配置参说明-1——整个配置3.1 配置说明3.2 参考4. 配置说明-2—详细说…

增量更新jar包的方法

由于现在绝大多数服务都采用spring boot,且在打包时一般选择全量包的形式,因此在服务依赖比较多的情况下,更新/添加其中的一个文件时,会造成很大的麻烦,比如一个服务打完包后,jar文件的体积可能在200M左右,因此在网络条件不好的情况下&#xff0c;频繁更新服务包还是比较麻烦的…

http/HTTPS相关的一些知识

2、http和https HTTP&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则。HTTP 是应用层协议&#xff0c;它以 TCP&#xff08;传输层&#xff09;作为底层协议&#xff0c;默认端口为 80。 http的通信过程&#xff1a;服务器在80端口等待客户的请…

联想Thinkpad X1 Carbon (7th Gen)电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。硬件型号驱动情况主板Thinkpad X1 Carbon处理器Intel Core i5-10210U (formerly Comet Lake)已驱动内存8GB DDR3 (or something like that)已驱动硬盘WDC PC SN730 SDBQNTY-256G-1001已驱动显卡Intel UHD 620Nvidia GeForce…

【AcWing-Python-785】快速排序

题目&#xff1a;https://www.acwing.com/problem/content/description/787/对应视频讲解&#xff1a;https://www.acwing.com/video/227/题目描述注意本题数据已加强。快速排序过程中&#xff0c;如果每次取区间起点或者终点作为分界点&#xff0c;则会超时。分界点换成随机值…

自动化测试工具airtest之上传文件或图片(web自动化上传图片)

web自动化测试图片上传的方法&#xff1a; 第一种为当具有input标签时&#xff0c;如&#xff1a; <input type"file" name"file" multiple"multiple"> 这类可以通过selenium中的send_keys()上传 直接实现&#xff1a; driver.find_eleme…

成功“拿捏”金三银四!汇总Java面试突击班后的面试小册

最近很多同学已经开始进行今年的面试了&#xff0c;好多同学说&#xff0c;想要今年最新版的Java面试突击班的内容话说回来&#xff0c;今天给大家分享的就是咱们面试突击班的文字PDF版本&#xff0c;下面是文字版的分享大家可以详细往下看&#xff01;由于文章的篇幅有限&…

常见web安全漏洞-暴力破解,xss,SQL注入,csrf

1&#xff0c;暴力破解 原理&#xff1a; 使用大量的认证信息在认证接口进行登录认证&#xff0c;知道正确为止。为提高效率一般使用带有字典的工具自动化操作 基于表单的暴力破解 --- 若用户没有安全认证&#xff0c;直接进行抓包破解。 验证码绕过 on server ---验证码校验在…

局域网下mac与win通过ssh互联(端口映射)

目录一、前置条件ip查看关闭防火墙二、win端ssh连接mac三、mac端ssh连接win四、mac端ssh连接win上的linux虚拟机此文章欢迎访问我的个人博客&#xff1a;https://qiandao.space/archives/portmapping mac端ssh连接win mac端ssh连接win上的linux虚拟机 win端ssh连接mac 日常开发…

【知识蒸馏】知识蒸馏(Knowledge Distillation)技术详解

参考论文&#xff1a;Knowledge Distillation: A Survey 1.前言 ​ 近年来&#xff0c;深度学习在学术界和工业界取得了巨大的成功&#xff0c;根本原因在于其可拓展性和编码大规模数据的能力。但是&#xff0c;深度学习的主要挑战在于&#xff0c;受限制于资源容量&#xff0…

Unity——使用铰链关节制作悬挂物体效果

目的在场景中创建一个悬挂的物体&#xff0c;是把多个模型悬挂在一起可以自由摇摆&#xff0c;类似链条的效果效果图前言什么是铰链关节&#xff1f;铰链关节 将两个刚体&#xff08;Rigid body&#xff09;组会在一起&#xff0c;从而将其约束为如同通过铰链连接一样进行移动。…

JavaSE基础部分总结

JavaSe基础部分 文章目录JavaSe基础部分1.命名规范2.基本的数据类型3.方法3.1方法的基本格式3.2 方法的分类3.3 方法的注释4.数组4.1 数组的命名格式4.2 数组中存在的址交换的操作4.3数组Arrays常用的方法1. Arrays.asList(数组作为参数或者数据作为参数)&#xff1a;2.Arrays.…

Spring Cloud Alibaba全家桶(一)——Spring Cloud Alibaba介绍

前言 本文为 Spring Cloud Alibaba介绍 相关知识&#xff0c;下边将对微服务介绍&#xff08;包括&#xff1a;系统架构演变、微服务架构介绍、常见微服务架构&#xff09;&#xff0c;Spring Cloud Alibaba介绍&#xff08;包括&#xff1a;Spring Cloud Alibaba 的定位、Spri…