C语言指针操作(八)返回指针值的函数详解
创始人
2025-05-28 22:22:37

目录

一、引入

二、返回指针值的函数的定义

2.1举例说明1

2.2举例说明2


一、引入

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

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

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

二、返回指针值的函数的定义

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

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

对初学C语言的人来说,这种定义形式可能不大习惯,容易弄错,使用时要十分小心。通过下面的例子可以初步了解怎样使用返回指针的函数。

2.1举例说明1

举例:有 a 个学生,每个学生有 b 门课程的成绩。要求在用户输入学生序号以后,能输出该学生的全部成绩,用指针函数来实现。

#include 
int main()
{float score[][4] = { {60, 70, 80, 90}, { 56,89 ,67,88 }, { 34,78,90,66 } };float* search(float(*pointer)[4], int n);		//函数声明float* p;int k;printf("输入要找的学生的序号:");scanf_s("%d", &k);printf("The scores of No.%d are:\n", k);p = search(score, k);					//调用search函数,返回score[k][0]的地址for (int i = 0; i < 4; i++)printf("%5.2f\t", *(p + i));		//输出score[k][0]-score[k][3]的值printf("\n");return 0;
}float* search(float(*pointer)[4], int n)	//形参pointer是指向一维数组的指针变量
{float* pt;pt = *(pointer + n);					//pt的值是&score[k][0]return pt;
}

运行结果:

程序分析:

函数 search 定义为指针型函数,它的形参 pointer 是指向包含 4 个元素的一维数组的指针变量。 pointer+1 指向 score 数组序号为 1 的行(学生序号是从0号算起的)。*(pointer+1)指向 1 行 0 列元素(对 pointer+1 加了 “ * ” 号后,指针从行控制转化为列控制了)。search 函数中的 pt 是指针变量,它指向 float 型变量(而不是指向一维数组)。main 函数调用 search 函数,将 score 数组首行地址传给形参 pointer (注意 score 也是指向行的指针,而不是指向列元素的指针)。k 是要查找的学生序号。调用 search 函数后,main 函数得到一个地址 &score[k][0] (指向第 k 个学生第 0 门课程),赋给 p。然后将此学生的 4 门课程的成绩输出。注意 p 是指向 float 型数据的指针变量,*(p+i) 表示该学生第 i 门课程的成绩。

2.2举例说明2

举例:对2.1中的程序,找出其中有不及格的课程的学生及其学生号。

#include 
int main()
{float score[][4] = { {60,70,80,90},{56,89,67,88},{34,78,90,66} };float* search(float(*pointer)[4]);		//函数声明float* p;for (int i = 0; i < 3; i++)				//循环3次{p = search(score + i);	//调用search函数,如有不及格返回score[i][0]的地址,否则返回NULLif (p == *(score + i))	//如果返回的是score[i][0]的地址,表示p的值不是NULL{printf("No.%d score:", i);for (int j = 0; j < 4; j++){printf("%5.2f ", *(p + j));	// 输出score[i][0]score[i][3]的值}printf("\n");}}return 0;
}float* search(float(*pointer)[4])	//定义函数,形参pointer是指向一维数组的指针变量
{float* pt = NULL;				//先使pt的值为NULLfor (int i = 0; i < 4; i++){if (*(*pointer + i) < 60)pt = *pointer;			//如果有不及格课程,使pt指向scoreL[i][0]}return pt;
}

运行结果:

程序分析:

函数 search 的作用是检查一个学生有无不及格的课程。在 search 函数中的 pointer 是指向一维数组(有 4 个元素)的指针变量。pt 为指向 float 型变量的指针变量。从实参传给形参 pointer 的是 score+i,它是 score 第 i 行的首地址,在 search 函数中,先使 pt=NULL (即 pt=0 )。用 pt 作为区分有无不及格课程的标志。若经检查 4 门课中有不及格的,就使 pt 指向本行 0 列元素,即 pt=&score[i][0];若无不及格则保持 pt 的值为NULL。将 pt 返回 main 函数。在 main 函数中,把调用 search 得到的函数值(指针变量 pt 的值)赋给 p。用 if 语句判断 p 是否等于 *(score+i),若相等,表示所查的序号为 i 的学生有不及格课程( p的值为 *( score+i ),即 p 指向 i 行 0 列元素),就输出该学生(有不及格课程的学生) 4 门课成绩。若无不及格,p的值是NULL,不输出。

相关内容

热门资讯

今年我省粮食产量达515.56... (来源:辽宁日报)转自:辽宁日报 图为在中储粮(盘锦)储运有限公司,装运粮食的重型卡车排起长队...
国家发展改革委部署促进投资止跌... (来源:辽宁日报)转自:辽宁日报 新华社北京12月13日电 (记者魏玉坤) 记者13日从全国发展和改...
江苏省实施《中华人民共和国森林... (来源:新华日报) 目 录 第一章 总则 第二章 森林、林木和林地权属管理...
姜堰数字化产品讲“活”理论 (来源:新华日报) □ 本报记者 卢佳乐 通讯员 姜宣 “王教授,您约我‘喝茶论道’,...
联合国维和部队在苏丹遇袭 6人... 转自:财联社【联合国维和部队在苏丹遇袭 6人死亡】财联社12月14日电,当地时间13日,苏丹武装部队...