返回指针值的函数

       一个函数可以返回一个整型值、字符值、实型值,也可以返回指针型的数据,即地址。概念与前面类似,只是返回的值的类型是指针类型而已。

       例如"int *a(int x,int y);",a是函数名,调用它以后能得到一个int*型(指向整型数据)的指针,即整型数据的地址。x和y是函数a的形参,为整型。

       请注意“*a”两侧没有括号,在a的两侧分别是*运算符和()运算符。而()优先级高于*,因此a先和()结合,显然这是函数形式。这个函数前面有一个*,表示此函数是指针型函数(函数值是指针)。最前面的int表示返回的指针指向整型变量。

       定义返回值的函数的原型的一般形式为:

类型名*函数名(参数表列);

题目:有a个学生,每个学生有b门课程,要求在用户输入学生序号以后能输出该学生的全部成绩。
解题思路:定义一个二维数组score来存放学生的成绩,为了简便,设学生数a为3,课程数为b为4。定义一个查询学生成绩的函数search,它是一个返回指针的函数,形参是指向一维数组的指针变量和整型变量n,
从主函数将数组名为score何要找的学生号k传递给形参。函数的返回值是&score[k][0]
(即存放序号为k的学生序号为0的课程的数组元素的地址),然后在主函数中输出该生的全部成绩。

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
	float score[][4]={{60,70,80,90},{70,92,96,70},{94,85,70,93}};
	float *search(float(*a)[4],int n);
//函数search定义为指针型函数,它的形参p指向包含4个元素的一维数组的指针变量。
	float *p;
	int i,k;
	printf("请输入学生的序号:");  
	scanf("%d",&k);
	printf("序号为%d的学生的成绩是:\n",k);
	p=search(score,k);
//调用search函数,返回score[k][0]的地址
		for(i=0;i<=3;i++)
	printf("%5.2f\t",*(p+i));
//输出score[k][0]~score[k][3]的值
	printf("\n");
    system("pause");
    return 0;
}
float *search(float(*a)[4],int n)
//float(*p)[4]:数组指针,指针p指向一个数组。
//函数search定义为指针型函数,它的形参a是指向包含4个元素的一维数组的指针变量。
{
  float *p0;
  p0=*(a+n);           //p3的值是&score[k][0]
/*   p+n指向score数组序号为n的行(学生序号从0开始),*(p+n)指向n行0列元素。
(对p+n加了*后,指针从行变控制转化为列控制了。)
search函数中的p3是指针变量,它指向float型变量而不是一维数组。*/
  return(p0);
}

如果search函数中语句p0=*(a+n); 写成p0=(*p+n); 输入1得到的不是第一个学生的成绩,而是score[0][n]开始的4个元素的值。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值