蓝桥杯——指针部分基础内容回顾二(2017.2.27)

本文回顾了蓝桥杯竞赛中的指针基础知识,涵盖函数指针的使用,如比较两个整数的大小;指针数组的应用,包括字符串排序;多重指针的概念,演示了如何通过指向指针的指针变量操作数据;最后介绍了动态内存分配,展示了创建动态数组并检查学生成绩不及格的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、函数指针   “类型名 (*指针变量名)(函数参数表列)”

1. 使用指向函数的指针,通过指针变量访问它所指向的函数:求整数a和b中的大者。

源代码:

#include <stdio.h>
int max(int x,int y)                               //注意返回值的类型为整型
{
	return (x>y)?x:y;
}
int main()
{
	int a,b,c;
	int (*p)(int,int);                         //指向函数的指针变量p
	p=max;                                     //使函数指针p指向max函数
	while(scanf("%d %d",&a,&b)!=EOF)
	{
		c=(*p)(a,b);                       //通过指针变量(间接)调用max函数
		printf("%d %d max=%d\n",a,b,c);
	}
	return 0;
}
程序截图:


2. 输入两个整数,然后让用户选择1或2,选1时调用max函数,输出二者中的大数;选2时调用min函数,输出二者中的小数。

源代码:

#include <stdio.h>
int max(int x,int y)
{
	return (x>y)?x:y;
}
int min(int x,int y)
{
	return (x<y)?x:y;
}
int main()
{
	int n,a,b;
	int (*p)(int,int);
	int result;
	while(scanf("%d %d",&a,&b)!=EOF)
	{
		scanf("%d",&n);
		if(n==1)
			p=max;
		else if(n==2)
			p=min;
		result=(*p)(a,b);
		printf("%d\n",result);
	}
	return 0;
}
程序截图:


3. 用指向函数的指针做函数参数:有两个整数a和b,由用户输入1,2或3。如输入1,程序就给出a和b中的大者;输入2,就给出a和b中的小者;输入3,则求a与b的和。

源代码:

#include <stdio.h>
int max(int a,int b)
{
	return (a>b)?a:b;
}
int min(int a,int b)
{
	return (a<b)?a:b;
}
int sum(int a,int b)
{
	return (a+b);
}
int fun(int x,int y,int (*p)(int,int))             //该函数形参是函数指针,接收作为实参的不同功能函数名的入口地址 
{                                                  //使其指向相应的功能函数 
	int result;
	result=(*p)(x,y);
	printf("%d\n",result);
}
int main()
{
	int a,b,c;
	int (*p)(int,int);
	int n;
	while(scanf("%d %d",&a,&b)!=EOF)
	{
		scanf("%d",&n);
		if(n==1)
			fun(a,b,max);
		else if(n==2)
			fun(a,b,min);
		else if(n==3)
			fun(a,b,sum);
	}
	return 0;
}
程序截图:


二、指针数组    “类型名 *数组名[ 数组长度 ]”

        注意指针数组与指向一维数组的指针变量的区别:例如int *p[4];  int (*p)[4];

        (不等长)字符串排序,其中5个字符串已给定

源代码:

#include <stdio.h>
#include <string.h>
#define maxlen 81
void sort(char *name[],int n)
{
	char *temp;
	int i,j,k;
	for(i=0;i<n-1;i++)              //选择法排序(实际上是改变指针数组各元素指向) 
	{
		k=i;
		for(j=i+1;j<n;j++)
		{
			if(strcmp(name[k],name[j])>0)
				k=j;
		}
		if(k!=i)
		{
			temp=name[i];
			name[i]=name[k];
			name[k]=temp;
		}
	} 
}
void print(char *name[],int n)
{
	int i;
	for(i=0;i<n;i++)
		printf("%s\n",name[i]);
}
int main()
{
	int n=5;
	char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Computer design"};  //确定指针数组各元素指向的5个字符串 
	sort(name,n);
	print(name,n);
	return 0;
}
程序截图:


三、多重指针(指向指针的指针)

1. 接上例,使用指向指针(数据)的指针变量,输出排序前的上述5个字符串

源代码:

#include <stdio.h>
#include <string.h>
#define maxlen 81
int main()
{
	int i;
	char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Computer design"};  //确定指针数组各元素指向的5个字符串 
	char **p; 
	for(i=0;i<5;i++)
	{
		p=name+i;
		printf("%s\n",*p);
	}
	return 0;
}
程序截图:


2. 用指向指针的指针的方法,输出n及n个整型数组的元素,然后输出

源代码:

#include <stdio.h>
#define maxn 1010
int main()
{
	int i,n,**p;                       //**p是指向指针型数据的指针变量 
	int a[maxn],*num[maxn];            //指针数组num保存整型数组a元素的地址 
	while(scanf("%d",&n)!=EOF)
	{ 
		for(i=0;i<n;i++)
		{
			scanf("%d",&a[i]);
			num[i]=&a[i];              //获得a数组元素地址 
			p=&num[i];                 //首先p指向指针数组的第一个元素num[0] 
			printf("%d ",**p);         //p=&num[i],*p=num[i]=&a[i],**p=a[i],因此用**p输出整型数组a中的元素 
		}
		printf("\n");
	}
	return 0;
}
程序截图:


四、动态内存分配

        建立动态数组,输入n及n个学生的成绩,另外用一个函数检查其中有无低于60分的,若有,则输出不及格的成绩。

源代码:

#include <stdio.h>
#include <stdlib.h>
void check(int *p,int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		if(*(p+i)<60)
			printf("%d\n",*(p+i));
	}
}
int main()
{
	int i,n;
	int *p;
	while(scanf("%d",&n)!=EOF)
	{
		p=(int *)malloc(n*sizeof(int));
		for(i=0;i<n;i++)
			scanf("%d",p+i);               //"p=&a[i]"
		check(p,n);
	}
	return 0;
}
程序截图:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值