当前位置: 首页 > news >正文

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

目录

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

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

数组传参

一维数组传参

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

#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*的地址,那么就可以放到二级指针里面去。即指针数组的数组名可以传过去。
在这里插入图片描述

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

相关文章:

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

目录数组传参一维数组传参二维数组传参指针传参一级指针传参二级指针传参我们在写代码的时候难免要把数组或者指针传给函数&#xff0c;那函数的参数该如何设计呢&#xff1f; 数组传参 一维数组传参 我们首先来看下面代码的几个例子&#xff1a; #include <stdio.h>…...

for循环中的setTimeout以及var let作用域

看了很多解释&#xff0c;感觉都不好理解。这个文章是我自己的理解&#xff0c;可以做个参考&#xff0c;如果我理解的不对&#xff0c;欢迎在评论区指正&#xff1a; var&#xff1a;使用var声明的变量具有全局作用域 &#xff08;循环中每次声明的是同一个变量&#xff09; l…...

有限差分法求解不可压NS方程

网上关于有限差分法解NS方程的程序实现不尽完备&#xff0c;这里是一些补充注解 现有的优秀资料 理论向 【1】如何从物理意义上理解NS方程&#xff1f; - 知乎 【2】NS方程数值解法&#xff1a;投影法的简单应用 - 知乎 【3】[计算流体力学] NS 方程的速度压力法差分格式_…...

Android入门第66天-使用AOP

开篇这篇恐怕又是一篇补足网上超9成关于这个领域实际都是错的、用不起来的一个知识点了。网上太多太多教程和案例用的是一个叫hujiang的AOP组件-com.hujiang.aspectjx:gradle-android-plugin-aspectjx。首先这些错的文章我不知道是怎么来的&#xff0c;其次那些案例真的运行成功…...

pl/sql篇之触发器

简述本文將具体简述触发器的语法&#xff0c;触发条件及其适用场景&#xff0c;希望对读者理解&#xff0c;使用触发器能起到作用。触发器的定位触发器是数据库独立编译&#xff0c;存储的对象&#xff0c;是数据库重要的技术。和函数不同&#xff0c;触发器的执行是主动的&…...

黑马《数据结构与算法2023版》正式发布

有人的地方就有江湖。 在“程序开发”的江湖之中&#xff0c;各种技术流派风起云涌&#xff0c;变幻莫测&#xff0c;每一位IT侠客&#xff0c;对“技术秘籍”的追求和探索也从未停止过。 要论开发技术哪家强&#xff0c;可谓众说纷纭。但长久以来&#xff0c;确有一技&#…...

Spring的创建和使用

目录 创建Spring项目 步骤 1)使用Maven的方式创建Spring项目 2)添加Spring依赖 3)创建启动类 存Bean对象 1.创建Bean对象 2.将Bean注册到Spring中 取Bean对象并使用 步骤 1.先得到Spring上下文对象 2.从Spring中获取Bean对象 3.使用Bean ApplicationContext VS Bea…...

如何实现外网跨网远程控制内网计算机?快解析来解决

远程控制&#xff0c;是指管理人员在异地通过计算机网络异地拨号或双方都接入Internet等手段&#xff0c;连通需被控制的计算机&#xff0c;将被控计算机的桌面环境显示到自己的计算机上&#xff0c;通过本地计算机对远方计算机进行配置、软件安装程序、修改等工作。通俗来讲&a…...

【跟着ChatGPT学深度学习】ChatGPT教我文本分类

【跟着ChatGPT学深度学习】ChatGPT教我文本分类 ChatGPT既然无所不能&#xff0c;我为啥不干脆拜他为师&#xff0c;直接向他学习&#xff0c;岂不是妙哉。说干就干&#xff0c;我马上就让ChatGPT给我生成了一段文本分类的代码&#xff0c;不看不知道&#xff0c;一看吓一跳&am…...

IM即时通讯架构技术:可靠性、有序性、弱网优化等

消息的可靠性是IM系统的典型技术指标&#xff0c;对于用户来说&#xff0c;消息能不能被可靠送达&#xff08;不丢消息&#xff09;&#xff0c;是使用这套IM的信任前提。 换句话说&#xff0c;如果这套IM系统不能保证不丢消息&#xff0c;那相当于发送的每一条消息都有被丢失的…...

【算法】三道算法题两道难度中等一道困难

算法目录只出现一次的数字&#xff08;中等难度&#xff09;java解答参考二叉树的层序遍历&#xff08;难度中等&#xff09;java 解答参考给表达式添加运算符&#xff08;比较困难&#xff09;java解答参考大家好&#xff0c;我是小冷。 上一篇是算法题目 接下来继续看下算法题…...

正交实验与极差分析

正交试验极差分析流程如下图&#xff1a; 正交试验说明 正交试验是研究多因素试验的设计方法。对于多因素、多水平的实验要求&#xff0c;如果每个因素的每个水平都要进行试验&#xff0c;这样就会耗费大量的人力和时间&#xff0c;正交试验可以选择出具有代表性的少数试验进行…...

DEXTUpload .NET增强的上传速度和可靠性

DEXTUpload .NET增强的上传速度和可靠性 DEXTUpload.NET Pro托管在Windows操作系统上的Internet Information Server(IIS)上&#xff0c;服务器端组件基于HTTP协议&#xff0c;支持从web浏览器到web服务器的文件上载。它也可以在ASP.NET服务器应用程序平台开发的任何网站上使用…...

SkyWalking 将方法加入追踪链路(@Trace)

SkyWalking8 自定义链路追踪@Trace 自定义链路,需要依赖skywalking官方提供的apm-toolkit-trace包.在pom.xml的dependencies中添加如下依赖: <dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId>&…...

MySQL Administrator定时备份MySQL数据库

1、下载并安装软件mysql-gui-tools-5.0-r17-win32.exe 2、将汉化包zh_CN文件夹拷贝到软件安装目录 3、菜单中打开MySql Adminstrator&#xff0c;见下图&#xff0c;初次打开无服务实例。 点击已存储连接右侧按钮①&#xff0c;打开下图对话框。点击“新连接”按钮&#xff…...

Kubernetes入门教程 --- 使用二进制安装

Kubernetes入门教程 --- 使用二进制安装1. Introduction1.1 架构图1.2 关键字介绍1.3 简述2. 使用Kubeadm Install2.1 申请三个虚拟环境2.2 准备安装环境2.3 配置yum源2.4 安装Docker2.4.1 配置docker加速器并修改成k8s驱动2.5 时间同步2.6 安装组件3. 基础知识3.1 Pod3.2 控制…...

深度学习模型压缩方法概述

一,模型压缩技术概述 1.1,模型压缩问题定义 因为嵌入式设备的算力和内存有限,因此深度学习模型需要经过模型压缩后,方才能部署到嵌入式设备上。 模型压缩问题的定义可以从 3 角度出发: 模型压缩的收益: 计算: 减少浮点运算量(FLOPs),降低延迟(Latency)存储: 减少内…...

《NFL橄榄球》:坦帕湾海盗·橄榄1号位

坦帕湾海盗&#xff08;英语&#xff1a;Tampa Bay Buccaneers&#xff09;是一支位于佛罗里达州的坦帕湾职业美式橄榄球球队。他们是全国橄榄球联盟的南区其中一支球队。在1976年&#xff0c;与西雅图海鹰成为NFL的球队。球队在最初的两个球季连败26场&#xff0c;在二十世纪七…...

Xmake v2.7.7 发布,支持 Haiku 平台,改进 API 检测和 C++ Modules 支持

layout: post.cn title: “Xmake v2.7.7 发布&#xff0c;支持 Haiku 平台&#xff0c;改进 API 检测和 C Modules 支持” tags: xmake lua C/C package modules haiku cmodules categories: xmake Xmake 是一个基于 Lua 的轻量级跨平台构建工具。 它非常的轻量&#xff0c;没…...

苹果ios签名证书的生成方法

在使用hbuilderx打包uniapp或html5应用的时候&#xff0c;假如是打包ios应用&#xff0c;是需要ios签名证书&#xff0c;和证书profile文件的&#xff0c;这个证书要求是p12格式的证书&#xff0c;profile文件又叫描述文件。 这两个文件&#xff0c;需要在苹果开发者中心生成&…...

SpringAI实践(07) - 本地向量嵌入模型集成指南

SpringAI实践&#xff08;07&#xff09; - 本地向量嵌入模型集成指南 1.概述 本文档详细说明如何在 SpringBoot 应用中集成本地部署的 ONNX 格式向量嵌入模型&#xff08;如 bge-small-zh&#xff09;&#xff0c;通过 spring-ai-starter-model-transformers 模块调用 ONNX …...

发动机阀系系统设计避坑指南:AVL-Excite中这10个元素配置最容易出错

发动机阀系系统设计避坑指南&#xff1a;AVL-Excite中这10个元素配置最容易出错 在发动机阀系系统的仿真建模中&#xff0c;AVL-Excite作为行业标杆工具&#xff0c;其强大的功能背后也隐藏着诸多配置陷阱。许多工程师在完成基础建模后&#xff0c;往往会在看似简单的参数设置上…...

【HTTP】HTTP协议核心体系:请求方法与状态码全结构化解析(附《思维导图》)

文章目录HTTP协议核心体系&#xff1a;请求方法与状态码全结构化解析一、核心基础概念1.1 HTTP方法的两大核心属性&#xff08;规范级定义&#xff09;1.2 HTTP状态码分类规则二、HTTP请求方法2.1 标准核心方法&#xff08;RFC 7231 定义&#xff09;2.1.1 只读类方法&#xff…...

多进程和多线程的特点和区别

小编觉得&#xff0c;多进程和多线程的差异主要体现在以下三个方面&#xff1a; 1. 资源隔离 多线程属于同一进程&#xff0c;共享进程的堆内存和全局变量&#xff0c;因此线程间可以直接访问彼此共享的数据。但需要注意的是&#xff0c;每个线程也拥有自己私有的栈空间&…...

5秒破解百度网盘提取码:baidupankey智能工具如何重塑你的资源获取体验

5秒破解百度网盘提取码&#xff1a;baidupankey智能工具如何重塑你的资源获取体验 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾为百度网盘加密资源而烦恼&#xff1f;面对"请输入提取码"的提示却束手无策…...

Z-Image-Turbo镜像实战教程:开箱即用,9步生成高清图片

Z-Image-Turbo镜像实战教程&#xff1a;开箱即用&#xff0c;9步生成高清图片 1. 为什么选择Z-Image-Turbo镜像 如果你正在寻找一个能快速生成高质量图片的AI工具&#xff0c;Z-Image-Turbo镜像可能是目前最省心的选择。这个镜像最大的优势在于它已经预置了完整的32GB模型权重…...

丹青幻境·Z-Image Atelier部署教程:Docker Compose一键启停方案

丹青幻境Z-Image Atelier部署教程&#xff1a;Docker Compose一键启停方案 1. 学习目标与前置准备 本教程将手把手教你如何使用Docker Compose快速部署丹青幻境Z-Image Atelier数字艺术创作平台。通过本教程&#xff0c;你将学会&#xff1a; 如何在5分钟内完成环境搭建如何…...

从CPython 3.12到3.14:我们逆向了217个AOT相关PR,提炼出6个决定编译成功率的核心宏定义(含Py_BUILD_CORE_MODULE与Py_LIMITED_API冲突解决方案)

第一章&#xff1a;Python 原生 AOT 编译方案 2026 高级开发技巧Python 社区在 2026 年迎来关键演进&#xff1a;CPython 官方正式集成原生 Ahead-of-Time&#xff08;AOT&#xff09;编译能力&#xff0c;无需依赖第三方运行时或 JIT 层即可生成平台专用的静态可执行文件。该特…...

Vite多入口页面配置实战:从单页应用到多页项目的平滑升级指南

Vite多入口页面配置实战&#xff1a;从单页应用到多页项目的平滑升级指南 当你已经用Vite构建了一个优雅的单页应用&#xff0c;突然业务需求要求你扩展为多页项目时&#xff0c;是否感到手足无措&#xff1f;别担心&#xff0c;这种架构演进在项目成长过程中再常见不过了。作为…...

AI-AGENT概念解析 - LLM部署文件

**问题&#xff1a;那一个下载到本地的大模型中&#xff0c;包括哪些文件&#xff0c;各有什么功能和作用&#xff0c;不同的大模型&#xff0c;包括的文件应该是不一样的。 大家会很自然地问到&#xff1a;下载到本地的大模型文件夹里到底有哪些文件&#xff1f;不同模型的文件…...