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

C语言 数组作为函数参数

1、数组元素作为函数实参
int a[10];  //相当于定义了10个变量,a[0]~a[9],那么数组元素就是:a[0]~a[9],数组元素就可以当成变量使用。
#include<stdio.h>
//函数声明
int whichmax(int x,int y);
int main()
{
    int a[10];
    a[1]=5;
    a[4]=7;
    int tmpmax=whichmax(a[1],a[4]);  //将数组元素当成变量使用,来作为函数调用的实参,依旧是值传递
    printf("tmpmax=%d\n",tmpmax);
    return 0;
}
//函数定义
int whichmax(int x,int y)  //这里的x,y,在函数调用的时候,系统会自动给他们分配内存,在函数调用完毕之后,内存会回收。
{
    if(x>y)
        return x;

    return y;
}

2、数组名作为函数实参
实参和形参个数要相等,类型要一致,按顺序对应,一一传递。
C语言规定,实参变量对形参变量的数据传递是“值传递”,就是单向传递,只能由实参传递给形参,不能由形参传递给实参。
此外,数组名也可以作为函数实参,数组名代表的是数组首地址,当将数组名作为函数的实参时,传递的是数组的首地址。
此时,函数中的形参也应该用数组名字(也可以是数组指针)。
强调:数组名作为函数参数时, 不是"值传递(值传递:形参是会分配内存的)"的概念, 不是单向传递,而是把 实参数组的 开始地址 传递给了 形参数组(不分配内存,直接使用实参的内存地址)。
这样两个数组就会 共同占用一段内存,其实叫 地址传递,也就是说,形参数组中各个元素的值如果发生了变化,会导致实参数组元素的值也发生相应改变,这就是与变量做函数参数明显不同的。
#include<stdio.h>
//函数定义在前面,就可以不用声明
void changevalue(int ba[5])  //这里 可以是ba[5],也可以是ba[] 形参数组的大小可以不指定,即使指定了也可以与实参数组大小不一                                 致,因为C编译器对形参数组的大小不做检查,只是将实参数组的首地址传递给形参数组。
                              //如果是 ba[9] 这里系统是没有分配内存的,ba[5]不属于a[5],非要往这里写入内容,很可能会导致崩                                   溃;因为a[5]传过来只有a[0]-a[4] 这五个内存地址,系统并没有分配9个内存地址
{
    ba[3]=27;   //这就是给内存赋值,所以这个值会带回给调用者
    ba[4]=45;
    return;
}
int main()
{
    int a[5];  //能引用的是a[0]--a[4]
    a[0]=85;
    a[1]=70;
    a[2]=98;
    a[3]=92;
    a[4]=78;
    changevalue(a);   //使用数组名作为实参
    for(int i=0;i<5;i++)
    {
        printf("a[%d]=%d\n",i,a[i]);
    }
    return 0;
}

              把实参数组的开始地址传递给了形参数组(不分配内存,直接使用实参的内存地址) 这样两个数组就会共同占用一段内存,其实叫地址传递
说明:
1、如果实参为数组名,则形参也为数组名;
2、形参数组与实参数组类型要一致,比如:都为int型,否则会出现意想不到的错误。
3、形参数组的大小可以不指定,即使指定了也可以与实参数组大小不一致,因为C编译器对形参数组的大小不做检查,只是将实参数组的首地址传递给形参数组。
3、用多维数组作为函数实参
可以用多维数组名作为形参和实参,形参数组在定义时,可以指定每一维的大小,也可以忽略第一维大小,但不能省略第二维大小。
实参是这些行这些列,形参就尽量跟实参一样(也是这些行,这些列),这样实参能引用的下标和形参一样可以引用,就会保证你不出错。
#include<stdio.h>
//函数定义在前面,就可以不用声明
void changevalue(int b[5][8])   //这里 5可以省略,但是 8不可以省略
{
    b[0][2]=15;  //实参里面能引用的下标,形参里面也可以引用
    
    return;
}
int main()
{
    int a[5][8];  //能引用的是a[0]--a[4]
    a[0][2]=3;
    changevalue(a);   //使用数组名作为实参
    printf("a[0][2]=%d\n",a[0][2]);


    return 0;
}

相关文章:

  • 软件测试【秋招面试】字节跳动等各类大厂—面经
  • 【算子2】spark(四):spark core:trans算子中key-value类型的算子使用说明
  • 9.25
  • codeforces-1734C - Removing Smallest Multiples
  • Java IO流的“四大家族”
  • 源码编译perl5遇到的问题汇总
  • 63 岁老工程师设计一屏双计算器软件工具,一起看看?
  • python实现自动换桌面壁纸恶搞程序【带源码】--------- 2.程序调试和打包
  • 抛开去中心化叙事 我们需要DAO的4个理由
  • 【Android入门】5、Broadcast 广播、Kotlin 的高阶函数、泛型、委托
  • clickhouse
  • 【周赛复盘】力扣第 312 场单周赛
  • QT通过QSS文件样式表设置改变窗体与按钮背景外观
  • kotlin基础知识
  • Keras学习记录之模型
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 78. Subsets
  • CSS实用技巧干货
  • Go 语言编译器的 //go: 详解
  • Javascript编码规范
  • JSDuck 与 AngularJS 融合技巧
  • Linux快速复制或删除大量小文件
  • Logstash 参考指南(目录)
  • mysql中InnoDB引擎中页的概念
  • Node + FFmpeg 实现Canvas动画导出视频
  • 阿里云前端周刊 - 第 26 期
  • 关于字符编码你应该知道的事情
  • 简单基于spring的redis配置(单机和集群模式)
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 强力优化Rancher k8s中国区的使用体验
  • 如何在 Tornado 中实现 Middleware
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 数组的操作
  • 双管齐下,VMware的容器新战略
  • 我从编程教室毕业
  • 以太坊客户端Geth命令参数详解
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • Android开发者必备:推荐一款助力开发的开源APP
  • 阿里云服务器如何修改远程端口?
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ###C语言程序设计-----C语言学习(6)#
  • #git 撤消对文件的更改
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (2)Java 简介
  • (5)STL算法之复制
  • (二十四)Flask之flask-session组件
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • .Family_物联网
  • .net core控制台应用程序初识
  • .NET Micro Framework初体验
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET单元测试
  • @DependsOn:解析 Spring 中的依赖关系之艺术