zoukankan      html  css  js  c++  java
  • 函数指针&指针函数(附指针&数组)

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

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

    函数指针

    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<stdio.h>
    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<stdio.h>
    void function1()
    {
      printf("function1
    ");
    }
    void function2()
    {
      printf("function2
    ");
    }
    void main()
    {
      typedef void(*Fun_ptr)();  //Fun_ptr 为指向函数的指针类型
      Fun_ptr pfun=function1;
      pfun();
      pfun=function2;  //赋给函数指针pfun的函数function2 应该和 函数指针所指函数
      pfun();       //的原型相一致:void function();
    }

    指针函数

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

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

    注:“()” 表示这是一个函数,“*” 表示此函数是以指针作为返回值的函数,返回的指针指向...类型的变量
    eg.
    #include <stdio.h>
    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: ",m); p=find(score,m-1); for(i=0;i<4;i++) printf("%5.2f ",*(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 <cstdio> 
    char *Names[]=
            {
                 "Clare",
                 "Paul",
                 "Charles",
                 "0"
            };
    
    int main(int argc, char** argv)
    {
            char **n=Names;
            while(*n!="0")     
            printf("%s
    ",*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);     //无返回值

  • 相关阅读:
    (剑指Offer)------二进制中1的个数
    LeetCode#58:最后一个单词的长度解析
    js 生成四个随机字母或数字+js获取当前日期
    ES6学习笔记----数组的扩展
    No component factory found for ListenerAddComponent. Did you add it to @NgModule.entryComponents?
    Can't bind to 'formGroup' since it isn't a known property of 'form'
    算法初相识---插入排序,冒泡排序,选择排序,以及分析算法
    Deno MongoDB 增删查改 接口
    Deno MySQL 增删查改接口
    Deno 几种常用的传参方式
  • 原文地址:https://www.cnblogs.com/claremore/p/4507233.html
Copyright © 2011-2022 走看看