转自:http://blog.csdn.net/xgmiao/article/details/9570825 点击打开链接

数组作为函数实参:

C语言中数组作为函数实参时,编译器总是将其解析为指向数组首元素地址的指针(地址调用)

原因:我们知道C语言函数的调用有传值和传地址调用。假设C语言对数组采用传值调用(对实参作一份拷贝,传递给被调用函数,函数不能修改实际实参值,而只能改变其拷贝),然后如果拷贝整个数组,则在时间和空间上开销都非常大。而对于函数,只要知道实参数组的首元素的地址,照样可以访问整个数组,所以采用传址调用效率更高。

注意的一点是对于函数来说,其接受的是数组首元素的地址,所以它是并不知道数组的大小的。

一维数组作函数实参:

[cpp] view plaincopy

 
  1. #include <stdio.h>
  2. void fun(char *p)
  3. {
  4. printf("%d\n",sizeof(p));
  5. char c = p[3];
  6. }
  7. void fun(char a[10])
  8. {
  9. printf("%d\n",sizeof(a));
  10. char c = a[3];
  11. }
  12. void fun(char a[])
  13. {
  14. printf("%d\n",sizeof(a));
  15. char c = a[3];
  16. }
  17. void main(int argc,char* argv[])
  18. {
  19. char a[100] = "jhalfalsdfa1111";
  20. fun(a);
  21. getchar();
  22. }

以上三个函数为一维数组作为实参的函数常用的定义方式。三个函数输出的结果都是4,说明了传给函数就是一个地址,特别对于第二种定义,不要以为该函数只能接收大小为10的数组,实际实参数组的大小与函数形参数组的大小是没有任何关系的。最好采用第三种方式定义,因为第一种方式,我们也可以认为该函数的实参为指针,而第二种方式可能会误认为该函数只能接收大小为10的数组。

二维数组作为函数实参:

错误认识:既然一维数组作为参数相当与一个指针,那二维数组作为参数就相当于一个二级指针。

正确认识:二维数组名作为参数时相当于一个数组指针(指向一维数组的指针)。

[cpp] view plaincopy

 
  1. #include <stdio.h>
  2. void fun(int a[4][3])
  3. {
  4. }
  5. void fun(int (*p)[3])
  6. {
  7. }
  8. void fun(int a[][3])
  9. {
  10. }
  11. void main(int argc,char* argv[])
  12. {
  13. int a[2][3] = {1,2,3,4,5,6};
  14. fun(a);
  15. }

以上二维数组作为函数实参的函数常用的定义方式。函数定义中,数组第二维的数目必须要与实参第二维的数目一样,第一维的数目无所谓。因为二维数组名做实参时,编译器是将其解析为一个指向大小为第二维的数组的指针。

c语言数组传递的更多相关文章

  1. c语言二维数组传递

    c语言二维数组传递,目前我总结三种方法,以及纠正一个不能使用的方法 /********************************* * 方法1: 第一维的长度可以不指定 * * 但必须指定第二维 ...

  2. 出于性能考虑,C语言自动地以传地址的方式将数组传递给被调函数 const 编译错误 最小权限原则

    #include <stdio.h> int main(void) { char array[5]; printf("array=%p,&array[0]=%p,& ...

  3. GO语言数组和切片实例详解

    本文实例讲述了GO语言数组和切片的用法.分享给大家供大家参考.具体分析如下: 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式: ...

  4. C语言指针传递详解

    传递指针可以让多个函数访问指针所引用的对象,而不用把对象声明为全局可访问,要在某个函数中修改数据,需要用指针传递数据,当数据是需要修改的指针的时候,就要传递指针的指针,传递参数(包括指针)的时候,传递 ...

  5. C语言数组

    在C语言中,对于三维或三维以上数组的使用并没有很好的支持,而且使用率也非常的低,后面会对三维数组做一些简单的分析,这篇文章主要以二维数组来探讨一些C语言中数组使用的相关概念和技巧. 1 一个var[i ...

  6. Go语言数组的使用

    Go 语言数组 Go 语言提供了数组类型的数据结构. 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形.字符串或者自定义类型. 相对于去声明number0 ...

  7. Go 语言数组

    Go 语言提供了数组类型的数据结构. 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形.字符串或者自定义类型. 相对于去声明number0, number ...

  8. Go语言数组

    目录 声明数组 数组在内存的结构 初始化数组 使用数组 函数间传递数组 数组使用注意事项 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列(这是一种同构的数据结构);这种类型可以是任意的原始类 ...

  9. C语言-数组篇

    C语言数组 一.数组的概念 用来存储一组数据的构造数据类型 特点:只能存放一种类型的数据,如全部是int型或者全部是char型,数组里的数据成为元素. 二.数组的定义 格式: 类型 数组名[元素个数] ...

随机推荐

  1. pageScope、requestScope、sessionScope、applicationScope的区别

    https://www.cnblogs.com/qianbaidu/p/6006459.html 1.区别: 1.page指当前页面有效.在一个jsp页面里有效 2.request 指在一次请求的全过 ...

  2. Python学习第一弹

    开发语言: 高级:Python.java.PHP  C#   GO  ruby   C++           ——>字节码   低级:C.汇编                          ...

  3. Requests库:python实现的简单易用的http库

    1.get请求: get(url, params, headers) 2.json 解析 3.content 获取二进制内容 4.headers 添加 5.post请求:post(url,data,h ...

  4. Codeforces Round #392 (Div. 2) Unfair Poll

    C. Unfair Poll time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  5. linux c scanf()小解

    今天学习了新的内容,关于c语言的scanf()函数. scanf()函数,读取指定格式的值赋值给相应变量.空格(‘ ‘),回车('\n'),TAB是分隔符,轻易不会被读取.还有,该函数的返回值是正确读 ...

  6. python基础之数据类型与变量patr2

    一.元素分类 有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中. 即: ...

  7. RHCSA考试

      RHCSA_PDF版传送门:https://files.cnblogs.com/files/zhangjianghua/RHCSA%E8%AF%95%E9%A2%98.pdf RHCE_PDF版传 ...

  8. Spring核心技术(十五)——BeanFactory

    BeanFactory是Spring IoC功能的潜在基础,但是现在BeanFactory一般仅仅用于直接集成第三方的框架,对于大多数的Spring用户来说,BeanFactory已经算是一个历史了. ...

  9. BZOJ 3027: [Ceoi2004]Sweet

    容斥 #include<cstdio> using namespace std; int a,b,n,m[15]; long long ans=0,mod=2004; long long ...

  10. P2341 [HAOI2006]受欢迎的牛(tarjan+缩点)

    P2341 [HAOI2006]受欢迎的牛 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的“喜欢”是可以传递的 ...