【C语言】数组名作函数参数

news2024/11/24 15:27:44

数组名作函数参数

    • 引例
    • 思考
    • 例2
    • 通用性
    • 指针形参和数组形参
    • 几点说明

引例

主函数中输入10个整数,并存入一个一维数组中;然后在被调函数中,将0号元素的值``改为原值的10倍;最后在主函数中输出结果。
思路
若想在被调函数中,对主调函数中某个局部变量的值进行修改,则必须将该局部变量的地址传递到被调函数中,然后以跨函数间接引用的形式进行赋值。
代码实现

#include<stdio.h>
void fun (int *p);
int main(void)
{
	int a[10],i;
	for (i=0;i<10;i++)
		scanf("%d",&a[i]);
	fun(&a[0]);
	for (i=0;i<=9;i++)
		printf("%d",a[i]);
	return 0;
}
void fun(int *p)
{
	*p=*p*10;
	return 0;
}

执行过程分析
首先,程序的执行控制权在主函数,在主函数中,定义一维数组,整型变量i,然后完成对整型数组的赋值。当函数执行到:

fun(&a[0]);

此时,调用被调函数fun(),此时实参&a[0],传递给形参,也就是在将a[0]的地址传递给形参p
参数传递之后,程序的执行控制权交给了被调函数fun(),参数传递完成之后,就形成了如下这样的指向关系:
在这里插入图片描述
然后此时通过间接引用可以修改a[0]的值。
但是注意,不可以直接以以下这种方式直接引用

a[0]=a[0]*10;

因为a[0]是局部变量,只可以在主函数中使用。
之后,被调函数执行到return,返回到主调函数,此时函数的执行控制权交给了主函数。在主函数中,再完成一维数组元素的全部输出。

思考

那么,如果要在被调函数中对主调函数中的一维数组的所有元素进行间接引用,是不是需要将每个元素的地址都传递到被调函数中呢?
实际上,并不需要。这是因为数组中元素的地址是连续有序的,只要知道数组中0号元素的地址,就可以求得其他元素的地址。
因此,只需要将数组的首地址传递到被调函数中即可。`

例2

在主函数中,输入10个整数,并存入一个一维数组a中,然后在被调函数中,将所有数组元素的值修改为原来的10倍;最后在主函数中输出结果。
思路
1.在主函数中以数组名a作为实参。
2.在被调函数中以指针变量p作为形参。
3.那么,参数传递之后,在被调函数中就可以用指针变量p来间接引用主调函数中的数组元素了。
数组在内存中的地址是连续的,就可以知道其他元素的地址
我们知道a[0]的地址为p,依次我们可以知道a[1]的地址为p+1,a[2]的地址为p+2…a[i]的地址为p+i。
此时形成这样的指向关系:
在这里插入图片描述
代码实现

#include<stdio.h>
void fun (int *p);
int main(void)
{
	int a[10],i;
	for (i=0;i<10;i++)
		scanf("%d",&a[i]);
	fun(a);
	for (i=0;i<=9;i++)
		printf("%d ",a[i]);
	return 0;
}
void fun(int *p)
{
	int i;
	for (i=0;i<10;i++)
		*(p+i)=*(p+i)*10; //间接引用 *(p+i)即a[i]
	return ;
}

*(p+i)即a[i]的间接引用形式。

通用性

由于数组名只是一个地址,并未包含数组的长度信息,因此为了提高被调函数通用性,通常需要设置另外一个参数,专门用来传递数组的长度
改进之后:

#include<stdio.h>
void fun (int *p,int n);
int main(void)
{
	int a[10],i;
	for (i=0;i<10;i++)
		scanf("%d",&a[i]);
	fun(a,10);
	for (i=0;i<=9;i++)
		printf("%d ",a[i]);
	return 0;
}
void fun(int *p,int n)
{
	int i;
	for (i=0;i<n;i++)
		*(p+i)=*(p+i)*10;
	return ;
}

原来的被调函数只能针对只有十个元素的数组进行修改,而上面修改过的被调函数可以针对具有n个元素的元素进行修改。因此,具有更好的通用性
可以发现,用数组名作函数参数时,只需要向被调函数传递数组的首地址长度而不需要传递所有数组元素的值,因而具有较高的存储效率时间效率

指针形参和数组形参

尽管形参p指针变量,而不是数组名,然后为了提高程序的直观性,C语言允许将间接引用形式的*(p+i)表示为数组元素形式的p[i]
在这里插入图片描述
从而可以将被调函数改写为下面的形式:

void fun(int *p,int n)
{
	int i;
	for (i=0;i<n;i++)
		p[i]=p[i]*10;
	return ;
}

甚至于函数头的指针形参,也可以改写成数组形式,从而进一步将被调函数进一步改写为

void fun(int p[],int n) //*p改写为p[]
{
	int i;
	for (i=0;i<n;i++)
		p[i]=p[i]*10;
	return ;
}

从而改进之后完整的源程序:

#include<stdio.h>
void fun (int *p,int n);
int main(void)
{
	int a[10],i;
	for (i=0;i<10;i++)
		scanf("%d",&a[i]);
	fun(a,10);
	for (i=0;i<=9;i++)
		printf("%d ",a[i]);
	return 0;
}
void fun(int p[],int n)
{
	int i;
	for (i=0;i<n;i++)
		p[i]=p[i]*10;
	return ;
}

几点说明

1.将函数头中的指针形参改写为数组形式,只是为了直观。
本质上来说,数组形参仍然是指针变量,因此不必在当括号中指定数组形参的长度。
例如:

void fun(int p[],int n)

2.在被调函数函数头中定义的数组可以称之为形参数组。在本质上形参数组实参数组同一个数组。
在这里插入图片描述
这是因为形参数组的元素p[i],等同于*(p+i),而 * (p+i)即p[i],又是实参数组元素a[i]间接引用形式;从而p[i]表示的数组元素就是a[i]

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

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

相关文章

10:00进去,10:05就出来了,这问的也太变态了···

从外包出来&#xff0c;没想到死在另一家厂子了。 自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到5月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资直降30%&#xff0c;顿时有吃不起饭的赶脚。 好在有个兄弟内推…

SSM框架-SpringMVC

1. SpringMVC 1.1 Spring与Web环境集成 ApplicationContext应用上下文获取方式 应用上下文对象是通过new ClasspathXmlApplicationContext(spring配置文件) 方式获取的&#xff0c;但是每次从容器中获得Bean时都要编写new ClasspathXmlApplicationContext(spring配置文件) &…

ActiveMq消息队列

ActiveMq是一种开源的java程序&#xff0c;支持Java消息服务(JMS) 1.1 版本 一、持久化机制 1、KahaDB&#xff1a;5.4及之后版本&#xff0c;默认使用日志文件 activemq.xml默认使用KahaDB持久化存储&#xff0c;默认配置安装路径data目录下 <persistenceAdapter> …

Django框架之模板其他补充

本篇文章是对django框架模板内容的一些补充。包含注释、html转义和csrf内容。 目录 注释 单行注释 多行注释 HTML转义 Escape Safe Autoescape CSRF 防止csrf方式 表单中使用 ajax请求添加 注释 单行注释 语法&#xff1a;{# 注释内容 #} 示例&#xff1a; {# 注…

09 FPGA—利用状态机实现可乐售卖机(附代码)

1. 理论 FPGA 是并行执行的&#xff0c;如果我们想要处理具有前后顺序的事件&#xff0c;就需要引入状态机。举个例子&#xff0c;将人看成 FPGA ,我们可以在散步的时候听歌和聊天这是并行执行的&#xff0c;但一天的行程安排却是以时间段前后执行的。 状态机简写为 FSM&#…

java前后端分离有详细内容吗?

微服务架构java前后端分离都有哪些具体内容&#xff1f;目前&#xff0c;有不少客户朋友经常询问我们类似的问题。其实&#xff0c;在新的经济发展形势下&#xff0c;提质增效的低代码开发平台微服务架构早已成为不少新老客户的选择&#xff0c;它们不仅能提高办公协作效率&…

成为更优秀的项目经理:快速提升影响力的六大原则与独门秘笈

在很多公司的组织架构中&#xff0c;项目经理并不是一个常规的职能岗位&#xff0c;项目组是为了某个项目目标临时组建的团队&#xff01; 这就造成了PM一个很尴尬的处境&#xff0c;权、责、利不匹配&#xff0c;也就是有责无权&#xff1a;PM既要对项目目标的实现负责&#…

K8S内容分发网络之集群,nginx,负载均衡,防火墙

目录 第一章.实验架构需求 第二章.实验环境准备 2.1.节点准备 2.2.环境准备 2.3.在master&#xff0c;node01&#xff0c;node02上操作安装docker 2.4.所有节点安装kubeadm&#xff0c;kubelet和kubectl 2.5.部署K8S集群 2.6.在master节点操作 2.7.所有节点部署网络插件…

小白windows安装python(图文详解)

以下是在 Windows 操作系统上安装 Python 的详细步骤&#xff1a; 打开浏览器&#xff0c;进入 Python 官网&#xff08;https://www.python.org/&#xff09;。 点击“Downloads”&#xff0c;然后选择适合您的操作系统的 Python 版本。例如&#xff0c;如果您的操作系统是…

“Shell“firewall防火墙

文章目录 一.Firewalld防火墙1.1firewalld概述1.2Firewalld和iptables的关系1.3Firewalld和iptables的区别 二.Firewalld网络区域2.1区域介绍&#xff1a;2.2firewalld 区域的概念:2.3Firewalld数据处理流程2.4Firewalld检查数据包的源地址的规则&#xff1a; 三.Firewalld防火…

05 Android开机启动之SystemServer

Android开机启动之SystemServer(SS) 一、梳理SystemServer启动流程 从上面整个Android开机启动思维导图(android 5.0的启动组成图)中可以看到: SystemServer是从Zygote中启动的。 开机->bootloader->kernel->init->zygote->SystemServer 二、SystemServe…

【嵌入式烧录/刷写文件】-1.5-Fill填充Motorola S-record(S19/SREC/mot/SX)文件

案例背景(共8页精讲)&#xff1a;该篇将告诉你&#xff0c;如何对一个S19文件进行填充&#xff1a; 对“起始地址”和“结束地址”内的非连续的Block块&#xff0c;进行填充&#xff1b;自定义填充范围。 目录 1 为什么要“Fill填充” 2 使用Vector HexView工具“填充”S19…

阿里,变“小”了,也变强了

文 | 螳螂观察 作者 | 青月 小公司总想做大&#xff0c;但在如今快速变换的科技浪潮下&#xff0c;一些大企业却想“变小”。 3月28日&#xff0c;阿里巴巴宣布启动“16N”组织变革&#xff0c;这意味着未来具备条件的业务集团和业务公司&#xff0c;都可以独立融资和独立上…

一文带你了解MySQL之InnoDB 统计数据是如何收集的

前言 本文章收录在MySQL性能优化原理实战专栏&#xff0c;点击此处查看更多优质内容。 我们前边唠叨查询成本的时候经常用到一些统计数据&#xff0c;比如通过show table status可以看到关于表的统计数据&#xff0c;通过show index可以看到关于索引的统计数据&#xff0c;那…

分享国内可用的免费ChatGPT网站_测评by杂草小生

参考的文章1&#xff1a;ChatGPT套壳网站汇总-5月21日更新_QQVQQ...的博客-CSDN博客 参考文章2&#xff1a;分享一个国内可用的免费ChatGPT网站_Aaron_Plus的博客-CSDN博客 ChatGPT是基于自然语言处理技术的聊天机器人&#xff0c;可以进行对话和提供相关信息。由于chatGPT不…

导入/导出 Postcat 格式文件,打通数据不再难

导入 Postcat 插件。 使用 导入功能有多个入口&#xff0c;你可以在 API 分组处点击加号导入 API&#xff1a; 也可以在点击设置&#xff0c;然后选择导入选项 导出 Postcat 插件 支持导出 Postcat JSON 文件。 使用 进入空间页面&#xff0c;可以看到导出功能&#xff0c;点…

XXL-SSO简要说明

一、介绍 XXL-SSO 是一个分布式单点登录框架。只需要登录一次就可以访问所有相互信任的应用系统。 拥有”轻量级、分布式、跨域、CookieToken均支持、WebAPP均支持”等特性。现已开放源代码&#xff0c;开箱即用。 官方文档 二、集成 2.1、源码下载 下载地址 2.2、代码结构…

剪辑中如何保持画面连贯性,视频剪辑用什么软件比较好?

随着各种视频软件和平台的流行&#xff0c;越来越多的人更喜欢观看视频&#xff0c;还有很多人出于兴趣和爱好&#xff0c;想要制作自己的视频&#xff0c;那要如何剪辑才能制作更好的视频呢&#xff1f;有什么比较靠谱的视频剪辑软件呢&#xff1f; 视频剪辑中保持画面连贯性…

Redis分布式锁及Redisson的实现原理

Redis分布式锁 一。什么是分布式锁 在讨论分布式锁之前我们回顾一下一些单机锁&#xff0c;比如synchronized、Lock 等 锁的基本特性&#xff1a; 1.互斥性&#xff1a;同一时刻只能有一个节点访问共享资源&#xff0c;比如一个代码块&#xff0c;或者同一个订单同一时刻只…

python:将遥感数据使用matplotlib库绘制成图片

作者:CSDN @ _养乐多_ 本文将介绍使用matplotlib库绘制遥感数据成图片的代码。 文章目录 一、示例代码二、更换颜色条三、自定义颜色条四、分段离散颜色设置一、示例代码 要加载本地的TIFF数据并绘制图像,你可以使用Python中的rasterio库和matplotlib库。以下是一个示例代码…