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型,数组里的数据成为元素. 二.数组的定义 格式: 类型 数组名[元素个数] ...
随机推荐
- JQuery实现父级选择器(广告实现)
效果图如下: HTML代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charse ...
- Laravel Nginx 除 `/` 外所有路由 404
解决方法 在nginx配置添加以下设置: location / { try_files $uri $uri/ /index.php?$query_string; } 详见Laravel官方文档:htt ...
- 1082: [SCOI2005]栅栏
链接 思路 二分+搜索+剪枝. 首先二分一个答案,表示最多可以切出x块.(一个结论:切出的一定是从较小的前x块.如果一个木材可以满足很多个需要的木材,那么切出最小的,就意味着以后再选时的机会更多.) ...
- JavaScript获取时间
var myDate = new Date(); console.log(myDate.getFullYear()); //获取完整的年份(4位,1970-????) ...
- ARC下还会存在内存泄露吗?
1.第三方框架不正当使用.2.block,delegate,NSTimer循环使用.3.非oc对象的内存处理.4.地图类处理.5.大次数循环内存暴涨. 非oc对象的释放: 例如使用CGImageRel ...
- unity3d中C#与JS的一些区别
unity3d目前支持C#和JS两种脚本语言. 学习过程中发现很多教程使用的是JS语言,自己还是用C#比较多,unity原生使用的是Mono,使用C#会更加接近unity的编程思想. 1.方法的定义, ...
- leetcode 【Rotate List 】python 实现
题目: Given a list, rotate the list to the right by k places, where k is non-negative. For example:Giv ...
- 牛客网暑期ACM多校训练营(第一场):D-Two Graphs
链接:D-Two Graphs 题意:给出图G1和G2,求G2的子图中和G1同构的个数. 题解:只有8个点,暴力枚举G2的点每个排列,让G1映射到G2中,求出同构个数a.同构的G2就是在G1有边的对应 ...
- sql 游标使用
declare @PASSDate datetime,@VLPN varchar(50),@VLPNColor varchar(10),@nambers int set @VLPN='';set @V ...
- create vm
#!/bin/sh echo $# [ $# < ] && { echo "error" exit } instance_name=$ instance_ip ...