博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
函数指针&指针函数(附指针&数组)
阅读量:5141 次
发布时间:2019-06-13

本文共 2757 字,大约阅读时间需要 9 分钟。

“()” 优先级高于 “*”

“[]” 优先级高于 “*”

函数指针

1、指向函数的指针变量

  注:C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数。

2、用途:调用函数、做函数的参数。

3、定义格式: 类型  (* 指针变量名)  ( 形参列表 );

  注:“形参列表”表示指针变量 指向的函数 所带的参数列表。

4、赋值:(例)

  int func(int x);    //声明一个函数

  int (*f) (int x);   //声明一个函数指针

  f=func;   //将func 函数的首地址赋给指针f 
( 或者将函数地址赋给函数指针:f = &func; )

注:赋值时函数func不带括号,也不带参数。func代表函数的首地址,经赋值后,指针f就指向函数func()的入口。

综上eg.
#include
int max(int x,int y){
return (x>y? x:y);}int main(){ int (*ptr)(int, int); int a, b, c; ptr = max; scanf("%d%d", &a, &b); c = (*ptr)(a,b); printf("a=%d, b=%d, max=%d", a, b, c); return 0;}
  分析:ptr是指向函数的指针变量,把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数。实际上ptr和max都指向同一个入口地址,不同的是max是函数名(不能改变),而ptr是一个指针变量,它可以指向任何函数,在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数。
  注:指向函数的指针变量没有++和 -- 运算

5、定义函数指针类型:typedef  int  (*Fun_ptr) (int,int);

   声明函数指针变量,并赋值: Fun_ptr maxFunc=max;

#include
void function1(){  printf("function1\n");}void function2(){  printf("function2\n");}void main(){  typedef void(*Fun_ptr)();  //Fun_ptr 为指向函数的指针类型  Fun_ptr pfun=function1;  pfun();  pfun=function2;  //赋给函数指针pfun的函数function2 应该和 函数指针所指函数   pfun();       //的原型相一致:void function(); }

指针函数

1、返回值类型是指针的函数

2、定义格式:类型*  函数名 ( 形参列表 );

注:“()” 表示这是一个函数,“*” 表示此函数是以指针作为返回值的函数,返回的指针指向...类型的变量
eg.
#include 
float* find(float(*pionter)[4],int n); //函数声明int main(void){ static float score[][4]={
{
60,70,80,90},{
56,89,34,45},{
34,23,56,45}}; float *p; int i,m; printf("Enter the number to be found:"); scanf("%d",&m); printf("the score of NO.%d are:\n",m); p=find(score,m-1); for(i=0;i<4;i++) printf("%5.2f\t",*(p+i)); return 0;} float* find(float(*pionter)[4],int n) //定义指针函数,pointer是一个指向数组的指针 { float *pt; pt=*(pionter+n);  //从数组 {60,70,80,90} 移动n次到数组 {34,23,56,45} return(pt);}

注:pointer是指向包含3个一维数组的指针变量。

 pointer+n指向score的第n+1行,*(pointer+1)指向第一行的第0个元素。

补充:指针&数组

指针数组:*a[i] 或 *(a[i])   //数组a中的元素都为int型指针

数组指针:(*a)[i]   //指向数组a的指针

常用:指针数组

用指针数组来代替多维数组,一个常见的用法就是处理字符串。

eg.

#include 
char *Names[]= { "Clare", "Paul", "Charles", "0" };int main(int argc, char** argv){ char **n=Names; while(*n!="0") printf("%s\n",*n++); return 0;}

注:数组中的最后一个元素被初始化为 "0",while循环以次来判断是否到达数组末尾。

综上

问:void (*(*papf)[2])(int);

这个papf是什么东西?(摘自C++ Primer)

答:

(*papf)[2]     //papf是一个指针,它指向一个数组,这个数组有两个元素

*(*papf)[2]     //papf是一个指针,它指向一个数组,这个数组有两个元素,且都是指针

*(*papf)[2]()     //papf是一个指针,它指向一个数组,这个数组有两个元素,且都是函数指针,

*(*papf)[2](int)     //并且此函数拥有一个int参数,

void *(*papf)[2](int);     //无返回值

 

转载于:https://www.cnblogs.com/claremore/p/4507233.html

你可能感兴趣的文章
Loop List
查看>>
USACO section3.1 Shaping Regions(漂浮法)
查看>>
Docker(十)-Docker创建DockerFile文件
查看>>
转:使用python的Flask实现一个RESTful API服务器端
查看>>
MissingNumber缺失的数字,FirstMissingPositive第一个缺失的正数
查看>>
EF 多线程TransactionScope事务异常"事务EFTransaction类定义:与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。"...
查看>>
U盘安装 CentOS7图解
查看>>
ASP.Net MVC3/4中Model验证错误信息的本地化
查看>>
玩Web虎-运行时受保护文件不可复制
查看>>
跨域解决方案
查看>>
安全警告——“Windows已经阻止此软件因为无法验证发行者”解决办法
查看>>
小票打印机页面打印无法自适应长度导致超长空白打印
查看>>
测试简书的Markdown支持
查看>>
Python爬虫(六)
查看>>
ELK
查看>>
eclipse常用快捷键
查看>>
认识Java 虚拟机的架构
查看>>
PAT甲题题解-1027. Colors in Mars (20)-水。。。
查看>>
mooc 数据结构作业(一)范围查询(Range)
查看>>
HDU 2048 神、上帝以及老天爷
查看>>