c语言数组传递
转自:http://blog.csdn.net/xgmiao/article/details/9570825 点击打开链接
数组作为函数实参:
C语言中数组作为函数实参时,编译器总是将其解析为指向数组首元素地址的指针(地址调用)
原因:我们知道C语言函数的调用有传值和传地址调用。假设C语言对数组采用传值调用(对实参作一份拷贝,传递给被调用函数,函数不能修改实际实参值,而只能改变其拷贝),然后如果拷贝整个数组,则在时间和空间上开销都非常大。而对于函数,只要知道实参数组的首元素的地址,照样可以访问整个数组,所以采用传址调用效率更高。
注意的一点是对于函数来说,其接受的是数组首元素的地址,所以它是并不知道数组的大小的。
一维数组作函数实参:
- #include <stdio.h>
- void fun(char *p)
- {
- printf("%d\n",sizeof(p));
- char c = p[3];
- }
- void fun(char a[10])
- {
- printf("%d\n",sizeof(a));
- char c = a[3];
- }
- void fun(char a[])
- {
- printf("%d\n",sizeof(a));
- char c = a[3];
- }
- void main(int argc,char* argv[])
- {
- char a[100] = "jhalfalsdfa1111";
- fun(a);
- getchar();
- }
以上三个函数为一维数组作为实参的函数常用的定义方式。三个函数输出的结果都是4,说明了传给函数就是一个地址,特别对于第二种定义,不要以为该函数只能接收大小为10的数组,实际实参数组的大小与函数形参数组的大小是没有任何关系的。最好采用第三种方式定义,因为第一种方式,我们也可以认为该函数的实参为指针,而第二种方式可能会误认为该函数只能接收大小为10的数组。
二维数组作为函数实参:
错误认识:既然一维数组作为参数相当与一个指针,那二维数组作为参数就相当于一个二级指针。
正确认识:二维数组名作为参数时相当于一个数组指针(指向一维数组的指针)。
- #include <stdio.h>
- void fun(int a[4][3])
- {
- }
- void fun(int (*p)[3])
- {
- }
- void fun(int a[][3])
- {
- }
- void main(int argc,char* argv[])
- {
- int a[2][3] = {1,2,3,4,5,6};
- fun(a);
- }
以上二维数组作为函数实参的函数常用的定义方式。函数定义中,数组第二维的数目必须要与实参第二维的数目一样,第一维的数目无所谓。因为二维数组名做实参时,编译器是将其解析为一个指向大小为第二维的数组的指针。
c语言数组传递的更多相关文章
- c语言二维数组传递
c语言二维数组传递,目前我总结三种方法,以及纠正一个不能使用的方法 /********************************* * 方法1: 第一维的长度可以不指定 * * 但必须指定第二维 ...
- 出于性能考虑,C语言自动地以传地址的方式将数组传递给被调函数 const 编译错误 最小权限原则
#include <stdio.h> int main(void) { char array[5]; printf("array=%p,&array[0]=%p,& ...
- GO语言数组和切片实例详解
本文实例讲述了GO语言数组和切片的用法.分享给大家供大家参考.具体分析如下: 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式: ...
- C语言指针传递详解
传递指针可以让多个函数访问指针所引用的对象,而不用把对象声明为全局可访问,要在某个函数中修改数据,需要用指针传递数据,当数据是需要修改的指针的时候,就要传递指针的指针,传递参数(包括指针)的时候,传递 ...
- C语言数组
在C语言中,对于三维或三维以上数组的使用并没有很好的支持,而且使用率也非常的低,后面会对三维数组做一些简单的分析,这篇文章主要以二维数组来探讨一些C语言中数组使用的相关概念和技巧. 1 一个var[i ...
- Go语言数组的使用
Go 语言数组 Go 语言提供了数组类型的数据结构. 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形.字符串或者自定义类型. 相对于去声明number0 ...
- Go 语言数组
Go 语言提供了数组类型的数据结构. 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形.字符串或者自定义类型. 相对于去声明number0, number ...
- Go语言数组
目录 声明数组 数组在内存的结构 初始化数组 使用数组 函数间传递数组 数组使用注意事项 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列(这是一种同构的数据结构);这种类型可以是任意的原始类 ...
- C语言-数组篇
C语言数组 一.数组的概念 用来存储一组数据的构造数据类型 特点:只能存放一种类型的数据,如全部是int型或者全部是char型,数组里的数据成为元素. 二.数组的定义 格式: 类型 数组名[元素个数] ...
随机推荐
- httpd虚拟主机、站点访问控制、基于用户的访问控制、持久链接等应用配置实例
httpd配置内容 httpd2.2 配置文件: /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf 服务脚本: /etc/rc.d/init.d/ ...
- zip压缩工具,unzip解压缩工具
zip压缩工具,unzip解压缩工具=================== [root@aminglinux tmp]# yum install -y zip[root@aminglinux tmp] ...
- linux系统ext文件系统知识
ext2文件系统细节 我们都知道,操作系统中的数据分为文件内容和文件属性两部分,其中文件内容就是文件的实体数据,而文件属性就是文件类型.权限.属主.修改时间等信息.操作系统会将上述文件的内容放入磁盘文 ...
- 有一段<script>代码,效果是点击<p>就会弹出信息,但是有的<p>点击会有效果,有的没有效果
问题:有一段<script>代码,效果是点击<p>就会弹出信息,但是有的<p>点击会有效果,有的没有效果 解决: 页面代码是至上而下执行的,如果你的这个标签在< ...
- Shell学习——数值运算
在Bash shell中,可以利用let.(( )).[]执行基本的算术操作,在高级操作时,使用expr和bc两个工具1.let[root@client02 ~]# no1=4[root@client ...
- Spark Streaming 交互 Kafka的两种方式
一.Spark Streaming连Kafka(重点) 方式一:Receiver方式连:走磁盘 使用High Level API(高阶API)实现Offset自动管理,灵活性差,处理数据时,如果某一时 ...
- POJ:2377-Bad Cowtractors
传送门:http://poj.org/problem?id=2377 Bad Cowtractors Time Limit: 1000MS Memory Limit: 65536K Total Sub ...
- idea 项目jar包出错
找到jar包所在文件目录,删除下面的所有文件,刷新maven项目,重新引入jar包
- 10.2 ajax
Ajax Ajax简介 AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异步交互 ...
- luogu3343 [ZJOI2015]地震后的幻想乡
ref 前置技能是bzoj的串珠子.这种子集dp好神啊qwq. 还有这种钦定点转移子集的方法建议按这题的方法写,不要看串珠子qwq #include <iostream> #include ...