其他指针

指向函数的指针

(1)函数指针

用来存放某一函数的起始地址,例如:int(*p)(int, int);


(2)用函数指针变量调用函数

一个简单的例子:求a和b中的大者。

#include <stdio.h>
int main()
{
int max(int, int);
int(*p)(int, int);
int a, b, c;
p = max;
printf("Please enter a and b:\n");
scanf_s("%d,%d", &a, &b);
c = (*p)(a, b);
printf("a=%d\nb=%d\nmax=%d\n", a, b, c);
return 0;
}


int max(int x, int y)
{
int z;
if (x > y)
z = x;
else
z = y;
return z;
}



(3)用指向函数的指针作函数参数

#include <stdio.h>
int main()
{
int max(int, int);
int min(int, int);
int add(int, int);
void fun(int x, int y, int(*p)(int, int));
int a = 34, b = -21, n;
printf("please choose 1,2 or 3:");
scanf_s("%d", &n);
if (n == 1) fun(a, b, max);
else if (n == 2) fun(a, b, min);
else if (n == 3) fun(a, b, add);
return 0;
}


void fun(int x, int y, int(*p)(int, int))
{
int resout;
resout = (*p)(x, y);
printf("%d\n", resout);
}


int max(int x, int y)
{
int z;
if (x>y)z = x;
else z = y;
printf("max=");
return(z);
}


int min(int x, int y)
{
int z;
if (x<y)z = x;
else z = y;
printf("min=");
return(z);
}


int add(int x, int y)
{
int z;
z = x + y;
printf("sum=");
return(z);
}



返回指针值的函数

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

例子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 i, k;
printf("enter the number of student:");
scanf_s("%d", &k);                                                  // 输入要找的学生的序号
printf("The scores of No.%d are:\n", k);
p = search(score, k);                                    //调用search函数,返回score[k][0]的地址
for (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);
}


例子2:找出其中有不及格的课程的学生及其学生号。

#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;
int i, j;
for (i = 0; i<3; i++)
{
p = search(score + i);                                   //调用search函数,如有不及格返回score[i][0]的地址,否则返回NULL,
if (p == *(score + i))                                     //如果返回的是score[i][0]的地址
{
printf("No.%d score:", i);
for (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是指向一维数组的指针变量
{
int i = 0;
float *pt;
pt = NULL;                                                   // 先使pt的值为NULL
for (; i<4; i++)
if (*(*pointer + i)<60) pt = *pointer;                        // 如果有不及格课程,使pt指向score[i][0] 
return(pt);
}


总结:上面的这些例子中,都涉及二维(多维)数组,明确指针的指向。

牢记数组名 —— 一维数组名 —— 二维数组名,即a —— a[ ] ——  a[ ][ ]   (一级一级的变更)



指针数组

其元素均为指针类型数据,即指针数组中的每一个元素都存放一个地址,相当于一个指针变量。

eg:

int *p[4];

char *name[] = { "Follow me", "BASIC", "Great Wall", "FORTRAN", "Computer design" };


指向指针数据的指针

定义:char **p;

eg1:

#include <stdio.h>
int main()
 {char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Computer design"};
  char **p;
  int i;
  for(i=0;i<5;i++)
    {p=name+i;                                        //"Follow me"这一元素的地址(首地址) 的地址给了p,p此时指向它
     printf("%s\n",*p);                              //*p表示"Follow me"的地址,*p亦表示为字符指针,故可输出……
    }
 }


eg2:

#include <stdio.h>
int main()
 {int a[5]={1,3,5,7,9};
  int *num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};
  int **p,i;
  p=num;
  for(i=0;i<5;i++)
    {printf("%d ",**p);
     p++;
    }
  printf("\n");
  return 0;
}


通过上面两个eg搞明白指针数组、指向指针数据的指针的各种关系。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值