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

指针操作系列文章:

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

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

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

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

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

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

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

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

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

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

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


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

目录

一、引入

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

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 <stdio.h>
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 <stdio.h>
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]的地址,否则返回NULL
		if (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的值为NULL
	for (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,不输出。

  • 19
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
C语言中的指针函数是指返回指针类型的函数,它们在函数的定义和调用上与普通函数有所不同。 指针函数的定义需要在函数名前加上返回类型为指针的声明,并在函数体内返回一个指针类型的。例如,我们可以定义一个返回整型指针函数如下: ```c int* allocateIntArray(int size) { int* array = (int*)malloc(size * sizeof(int)); return array; } ``` 在调用指针函数时,需要用一个与返回类型相匹配的指针变量接收返回。例如,调用上述函数并将返回存储在指针变量中: ```c int* myArray = allocateIntArray(5); ``` 上述代码中,myArray是一个整型指针变量,它用于存储allocateIntArray函数返回。这个返回是一个指向分配的整型数组的指针指针函数的调用过程中,我们还需要注意以下几点: 1. 为了避免内存泄漏,我们通常需要在不使用指针的时候手动释放内存,可以使用free函数来释放通过malloc分配的内存。 2. 在函数内部分配的内存空间返回给调用者后,我们应该确保在使用这块内存之前不会被其他操作修改或释放掉,否则可能导致程序运行时错误。 3. 指针函数也可以作为参数传递给其他函数,使得我们可以更方便地使用和操作指针类型的数据。 总结来说,指针函数是具有返回指针类型的函数,其定义和调用方式与普通函数有所区别。使用指针函数可以更灵活地操作和传递指针类型的数据,但在使用时需要注意内存的释放和确保指针的有效性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

juechen333

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值