在普通变量或下标变量作函数参数时,形参变量和实参变量是由编译系统分配的两个不同的内存单元。在函数调用时发生的值传送是把实参变量的值赋予形参变量。在用数组名作函数参数时,不是进行值的传送,即不是把实参数组的每一个元素的值都赋予形参数组的各个元素。因为实际上形参数组并不存在,编译系统不为形参数组分配内存。那么,数据的传送是如何实现的呢?在我们曾介绍过,数组名就是数组的首地址。因此在数组名作函数参数时所进行的传送只是地址的传送,也就是说把实参数组的首地址赋予形参数组名。形参数组名取得该首地址之后,也就等于有了实在的数组。实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。因此当形参数组发生变化时,实参数组也随之变化。


上图说明了这种情形。图中设a为实参数组,类型为整型。a占有以2000为首地址的一块内存区。b为形参数组名。当发生函数调用时,进行地址传送,把实参数组a的首地址传送给形参数组名b,于是b也取得该地址2000。于是a,b两数组共同占有以2000为首地址的一段连续内存单元。从图中还可以看出a和b下标相同的元素实际上也占相同的两个内存单元(整型数组每个元素占二字节)。例如a[0]和b[0]都占用2000和2001单元,当然a[0]等于b[0]。类推则有a[i]等于b[i]。
多维数组也可以作为函数的参数。在函数定义时对形参数组可以指定每一维的长度,也可省去第一维的长度。因此,以下写法都是合法的:
int MA(int a[3][10]);或int MA(int a[][10]);

下面给出两个将数组传递进函数的例子:
ex1:

//求5名学生的平均成绩
#include <stdio.h>float aver(float a[5])  //此处函数的定义中数组的元素个数可以省略,由传入的数组决定
{int i;float av,s=a[0];for(i=1;i<5;i++)s=s+a[i];av=s/5;return av;
}int main(void){float sco[5],av;int i;printf("\ninput 5 scores:\n");for(i=0;i<5;i++)scanf("%f",&sco[i]);av=aver(sco);  //此处将数组传递进函数时使用的是数组名称,没有括号printf("average score is %5.2f",av);return 0;
}

ex2:

//将数组中小于0的元素置成0
#include <stdio.h>
void nzp(int a[8])
{int i;printf("\nvalues of array are:\n");for(i=0;i<8;i++){if(a[i]<0)a[i]=0;printf("%d ",a[i]);}
}int main(void)
{int b[5],i;printf("\ninput 5 numbers:\n");for(i=0;i<5;i++)scanf("%d",&b[i]);printf("initial values of array b are:\n");for(i=0;i<5;i++)printf("%d ",b[i]);nzp(b);  //将有5个元素的数组传递进一个有8个元素的数组的函数,编译通过printf("\nlast values of array b are:\n");for(i=0;i<5;i++)printf("%d ",b[i]);return 0;
}

C语言 数组传递与值传递讲解相关推荐

  1. go语言传参是值传递还是引用传递

    曾经在某次go面试中被面试官问到:"go中引用类型有哪些?",我答到:"slice,map,channel",面试官:"其实go没有引用类型,都是值类 ...

  2. go slice获取唯一值_Go语言引用传递与值传递

    先说结论 GO中只有值传递,没有引用传递 所谓值传递,就是实参通过拷贝将自身内容传递给形参.也就是将传递的内容拷贝一份,给函数.所以函数外和函数里对这个参数地址求值,应该是不一样的. 证明如下: fu ...

  3. C语言参数传递——地址传递与值传递

    以经典的交换变量函数 swap(a,b) 为例,说明地址传递与值传递的区别. 值传递:函数的形参变量与实参变量,是两个完全无关的变量,函数在被调用时,创建形参,将实参的值复制过来(替身).形参本身在函 ...

  4. java还值_Java到底是引用传递还是值传递

    前言 前段时间在群里看到类似这样一个问题,下面的代码会输出什么呢? public void test(){ String str = "hello"; change(str); S ...

  5. java引用传递_理解Java中的引用传递和值传递

    关于Java传参时是引用传递还是值传递,是一个讨论比较多的话题, 有说Java中只有值传递,也有些地方说引用传递和值传递都存在,本篇记录思考过程,不保证正确性, 感兴趣的同学一起讨论. 1.基本类型和 ...

  6. C#中方法参数的引用传递、值传递。

    一.值类型和引用类型 C# 中的类型一共分为两类,一类是值类型(Value Type),一类是引用类型(Reference Type). 值类型包括结构体(struct)和枚举(enum). 引用类型 ...

  7. Java到底是引用传递还是值传递

    前言 前段时间在群里看到类似这样一个问题,下面的代码会输出什么呢? public void test() {String str = "hello";change(str);Sys ...

  8. 一道关于引用传递和值传递的JS题

    先看题1 var obj = {name:"a"} function bar(obj) {console.log(obj.name);obj = {name:"b&quo ...

  9. java中是引用传递还是值传递....

    刚才与Z师兄聊天,他提问: 你说java中是引用传递还是值传递啊? 当时俺搞混了这个"传递"的意思, 本来以为是对象的实例化比如: abc a=new abc(); 这个a 是引用 ...

  10. PHP 怎样理解go指针,golang指针传递和值传递的区别是什么?

    Go允许通过指针(有时称为引用)和值来传递参数.在这篇文章中,我们将比较两种方法,特别注意可能影响选择的不同情境. 指针传递与值传递 严格地说,go方法或函数只有一种传递方式,那就是值传递.每次将一个 ...

最新文章

  1. java配置文件实现方式_java相关:详解Spring加载Properties配置文件的四种方式
  2. java重定向带参数_急 求助重新封装重定向带参数问题
  3. 汇总|Yolo开源项目
  4. 开学季,如何用数据保证学生安全?这套方案值得一看
  5. Android---AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作
  6. 有抱负/初级开发人员的良好习惯-避免使用的习惯
  7. 设计模式之建造者模式(Builder)
  8. 国内外独立IP行情及网站用独立IP优势面面观
  9. 腾讯百度等22家股东退出 链家注册资本缩水34%
  10. Literal Web 服务器控件
  11. spring自带任务调度-xml方式
  12. java private list_Java基础知识回顾之四 ----- 集合List、Map和Set
  13. 征信考量社交化和大数据化
  14. 贝壳雕刻者怎样才能创造出更好的作品
  15. 华为手机安装GMS服务
  16. MinIO异常the region is wrong; expecting ‘us-east-1‘
  17. 高中知识复习——log2(n)
  18. 日志分析篇---Web日志分析
  19. java发现城市_java实现简单注册选择所在城市
  20. 孙陶然:定战略时切忌好高骛远

热门文章

  1. Oracle的启动机制
  2. Android中focusable属性的妙用——底层按钮的实现
  3. Centos下安装apahce的configure: error: APR not found. Please read the documentation解决办法
  4. [转载]潜移默化学会WPF(技巧篇)--具有Items元素的控件子项获取(一)
  5. 4月3日 尤金.卡巴斯基在北大精彩演讲
  6. 车道线检测参考学习资料
  7. Boost.Asio使用实例
  8. boost之对象池使用实例
  9. Semantic UI
  10. Python-栈的链式表实现(没写清楚)