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

来源:互联网 发布:华为网络机顶盒密码 编辑:程序博客网 时间:2024/05/20 11:23

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

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);                         //指向函数的指针变量pp=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 81void 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 81int 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 1010int 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;}
程序截图:


1 0
原创粉丝点击