用指向数组的指针作函数参数.etc

本文以课本上的实例介绍如何在C语言中使用指向数组的指针作为函数参数。通过定义计算平均值的average函数和搜索特定学生成绩的search函数,探讨了指针在多维数组操作中的应用。重点解析了*p和(*p)[4]的区别,前者指向数组的第一个元素,后者指向一维数组的首地址。average函数通过不断加一操作遍历所有元素,而search函数结合指针和索引找到指定学生的成绩。
摘要由CSDN通过智能技术生成

今天还是以课本上的例子为主。

有一个班,3个学生各学四门课,计算总平均分及第n个学生的成绩。

先定义一个计算平均值得函数,average。

<span style="font-size:14px;">void average(float *p,int n)
{
    float sum=0,aver;
    float *end=p+n-1;		//当n=12时,end的值是p+11,指向最后一个元素
    for(;p<=end;p++)sum+=*p;
    aver=sum/n;
    printf("%.2f\n",aver);

}</span>

这个就很简单了。

然后在定义一查找的函数,search。

<span style="font-size:14px;">void search(float (*p)[4],int n)
{
    int i=0;
    printf("the NO.%d 's number is:\n",n);
    for(i=0;i<4;i++)
        printf("%5.2f ",*(*(p+n)+i));	//输出n行的每个元素

}
</span>

这些都十分简单。但是易混淆的在主函数传递参数时。

<span style="font-size:14px;">int main()
{
   void average(float *p,int n);		//形参为指向数组首地址的指针
   void search(float (*p)[4],int n);	//形参为指向一维数组的指针
   float score[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}};
   average(*score,12);		//传递的是score[0][0]
   search(score,2);		//传递的是score[0]
   return 0;
}</span>

这里要注意*p和(*p)[4]的不同,*p是指指向数组首地址的指针,即使指向score[0][0],此时p+1是指score[0][1]指向下一个元素。

而(*p) [4]是指向一维数组首地址的指针,即指向score[0],此时p+1是指score[1]指向下一维元素首地址。

而且,(*p)[4]和*p[4]是不同的。*p[4]是指针数组。

所以average通过*score的传递,可以通过不断的加一来得到所有元素的值。

而search通过score和n,求得第n行元素的值。

全部源代码在下:

<span style="font-size:14px;">#include<stdio.h>
int main()
{
   void average(float *p,int n);
   void search(float (*p)[4],int n);
   float score[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}};
   average(*score,12);
   search(score,2);
   return 0;
}
void average(float *p,int n)
{
    float sum=0,aver;
    float *end=p+n-1;
    for(;p<=end;p++)sum+=*p;
    aver=sum/n;
    printf("%.2f\n",aver);

}
void search(float (*p)[4],int n)
{
    int i=0;
    printf("the NO.%d 's number is:\n",n);
    for(i=0;i<4;i++)
        printf("%5.2f ",*(*(p+n)+i));

}
</span>


 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值