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

目录

一、引入

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

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,不输出。

C语言指针操作系列文章:

C语言指针操作(一)地址,指针,指针变量是什么

C语言指针操作(二)指针变量作为函数参数

C语言指针操作(三)通过指针引用数组

C语言指针操作(四)用数组名作函数参数

C语言指针操作(五)通过指针引用多维数组

C语言指针操作(六)通过指针引用字符串

C语言指针操作(七)指向函数的指针

C语言指针操作(八)返回指针值的函数

C语言指针操作(九)指针数组和多重指针

C语言指针操作(十)动态内存分配与指向它的指针变量

C语言指针操作(十一)有关指针的小结