数组作为函数参数——指针常量/常量指针

之前一直认为数组名就是指针,其实不然。数组名作为函数参数时才会退化为同名同类型的指针,指针作为函数参数时才会和数组名的使用是等效的。(注意,等效只是说效果相同,并不是等价,不能认为数组名就是指针,指针就是数组名。)

下面的程序:有一个长度为4的float数组存放四个数,此数组作为一个计算平均值的函数的参数。



#include <stdio.h>
#include <string.h>

float Avarage(float array[4])
{
	int i;
	float aver;
	float sum = array[0];

	for ( i = 1; i <= 3; i++)
	{
		sum = sum + array[i];
	}
	
	aver = sum /4;

	return aver;
}

int main(void)
{
	float score[4] = { 10.5, 10.5, 10.5, 10.5};

	
	printf("%.2f\n",Avarage(score));//这里的参数如果
//写成score[4]会出错,出错原因是Average这个函数的参数应该是一个float类型的指针
//如果实参是score[4],float类型的实参与float*类型的形参不兼容。
//写成score[]也不对,只有score是对的。

	return 0;
}

在定义Average()函数的时候,如果函数参数是一个数组,在定义的时候是可以这么写的,Average()这个函数定义时形参是float类型的数组,实际上这个形参数组在接下来的函数体中是退化为指针来使用的,所以Average(float arrar[10]或float array[])实际上是Average(float* array) !(函数定义时,其实也不必指明形参数组的大小,因为这个时候不涉及到具体内存空间的分配。)

下面的定义是相同的,在下面的函数体中,array这个数组名实际上就是同名的指针变量float* array,而且float* array这个指针变量的值是float array[0]的地址。



#include <stdio.h>
#include <string.h>

float Avarage(float* array)//注意看这里。
{
	int i;
	float aver;
	float sum = array[0];

	for ( i = 1; i <= 3; i++)
	{
		sum = sum + array[i];
	}
	
	aver = sum /4;


		return aver;
}

int main(void)
{
	float score[10] = { 10.5, 10.5, 10.5, 10.5};

	
	printf("%.2f\n",Avarage(score));
/*在调用这个函数时需要输入实参,其实参应当是float*类型的变量,比如一个float数组的数!组!名!,这个实参数组名实际上也相当于是一个指针*/

	return 0;
}

http://blog.sina.com.cn/s/blog_7f69fbf90102whhe.html

数组作为函数的形参,调用函数时要为数组名分配内存空间吗

无需。

数组名准确的理解就是一个指针,而且是一个常量指针,固定指向它所代表的数组的第一个元素。

当实参和形参都是数组的时候,发生调用时把实参数组名里面的常量地址传给形参数组名,就是说形参数组名保存的就是实参数组名里面存的地址。这样在被调用函数内部,形参数组就指向了和实参数组名指向的同一个数组。
这样说吧:虽然形参是个数组,但实际上传递的参数只有实参数组名这个指针常量(把这个指针传给了形参数组名)。形参数组名当然要占内存空间,但无需(也不是)你在被调用函数里面去专门给它分配空间(这是编译器自动完成的)。你要想编译和调用正确,只需确保你的实参数组和形参数组是一个类型的即可。就是说,你在定义函数头的时候,无需指定形参数组的大小(指定来也是没有的,因为实参只传了一个指针给数组的名字)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小哇123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值