扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
函数定义和函数调用是两个概念,函数定义 为f(int *arr),表示参数是一个整型指针,因此使用该函数时要传递一个地址,如变量int a=0; 调用函数f传递a的地址时需要写为f(a);而对于数组来说,如int b[]=[1,2,3], b本身就是数组首元素的地址,因此调用函数f传递数组首地址需要写为f(b)。
创新互联专注于企业全网整合营销推广、网站重做改版、滁州网站定制设计、自适应品牌网站建设、H5页面制作、成都做商城网站、集团公司官网建设、成都外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为滁州等各大城市提供网站开发制作服务。
在C语言,数组无论作为参数还是返回值,都是以指针形式返回或者传递的。在数组中,数组名字代表的是数组第1个元素的地址。比如如下数组。
int
a[10]
=
{1,2,3,4,5,6};
数组名a,实际上相当于a[0]。所以,当实参是数组名,形参是指针变量时,只要保证数据类型一致即可传递。如下面的示例代码:
#include stdio.h
void f(int *p, int size) {
for (int inx=0; inx!=size; ++inx) printf("%d\t",p[inx]);
printf("\n");
}
int main()
{
int a[4] = {1,2,3,4};
f(a,4);
return 0;
}
举例:
void f(int *p)
{
}
int arr[]={1,2,3};
因为函数f的形参是一个类型为int的指针变量,所以调用f时,可以将数组名arr作为实参传给形参p。即可以这样调用:f(arr);
解释:在C语言中,所有非数组形式的数据实参都以传值形式(对实参做一份拷贝并传递给调用的函数,函数不能修改作为实参实际变量的值,而只能修改传递给它的那份拷贝)调用。
然而,拷贝整个数组都无论是在时间还是存储空间上开销都是非常巨大的,在绝大部分时间你并非需要拷贝整个数组,你只想告诉函数在哪一时刻需要哪个特定数组,要达到这一目的,可以考虑的方法是在形参上增加一个存储说明符(storage specifier)表示它时传值调用还是传址调用。
函数的返回值“绝不能”是函数数组,而只能是指向数组或函数的指针。
有些人喜欢理解为:除数组和函数之外所有C语言参数在默认情况下都是传值调用,数组和函数都是传址调用。
这种理解有些片面,数据也可以使用传址调用,只要在它前面加上取址操作符()这样传递的是实参的地址而不是实参的拷贝。
因为编译器的机制非常清楚—在被调用的函数中,你只拥有一个指向变量的指针而不是变量本身。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流