指针(2)-- 函数、数组、指针

指针(2)-- 函数、数组、指针


假设要求编写一个处理数组的函数,该函数如何定义及调用?
假设有一个marbles的int类型的数组,sum函数返回数组中所有元素之和。

分析

sum函数的输入参数应该为marbles数组,则可能的函数调用为:

total = sum(marbles); 

由于数组名为该数组首元素的地址,因此sum()的实参marbles实际是一个储存int类型值的地址,应该把地址赋给指针形式的参数,即函数的形参应该是一个指向int类型变量的指针。
因此,sum()对应的函数原型应该为:

int sum(int * ar); // 对应的函数原型

sum()从该参数中获得了什么信息?它获得了输入数组的首元素的地址,知道了要从该地址上找出一个整数。
但是,从上述形式的函数原型中,sum函数无法得知数组的元素数量。对此问题,有两种解决方法:
(1)函数体中使用循环,通过循环次数设置计算的元素个数;
(2)在函数原型中引入表示数组大小的形参:

int sum(int  *ar , int size);

示例函数

1、函数体中使用循环,通过循环次数设置计算的元素个数

int sum(int * ar)
{
int n = 10 ; //假设数组中共有10个元素
int total,i;
for (i = 0,total = 0;i < n ; i++)
{
total += ar[i];
}
return total;
}

2 在函数原型中引入表示数组大小的形参:

int sum(int * ar,int n) //n表示数组大小
{
int total ,i;
for(total = 0, i = 0; i < n ; i++)
{
total += ar[i];
}
return total;
}

几种等价的函数原型及函数定义

以下四种函数原型等价:

int sum(int * ar,int n) ; //第一种
int sum(int * ,int);//第二种
int sum(int ar[],int n);//第三种
int sum(int [],int);//第四种

由于函数定义中的参数名不能省略:因此下面两种函数定义等价:

int sum(int * ar,int n) 
{
}
int sum(int ar[],int n)
{
}

从以上分析可知,处理数组的函数实际上用指针作为参数。至于C语言,ar[i]和*(ar+1)这两个表达式都是等价的。无论ar是数组名还是指针变量,这两个表达式都没问题。但是,只有当ar是指针变量时,才能使用ar++这样的表达式。
指针表示法(尤其与递增运算符一起使用时)更接近机器语言,因此一些编译器在编译时能生成效率更高的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值