zoukankan      html  css  js  c++  java
  • 指针函数和函数指针

    1.指针(型)函数

    指针函数概念:

      本质上还是个函数,因其返回值是一个指针而得名。

      在C语言中允许一个函数的返回值是一 个指针(即地址),这种返回指针值的函数称为指针型函数

    指针函数的定义和使用:

    • 格式:
      类型说明符 *函数名(形参表) {
        /*函数体*/
      }
      其中函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了 返回的指针值所指向的数据类型。
    #include <stdio.h>
    char *func(char str[]);
    char *function(char *p);
    
    int main(int argc, const char * argv[]) {
        /*
         返回指针的函数
         */
        char cs[] = "VSVSVSVSVS";
        char *str = func(cs);
        
        printf("%s
    ",str);
        
        char *str2 = function(cs);
        printf("%s
    ",str2);
        return 0;
    }
    
    // 定义一个返回指针的函数
    char *func(char str[]) // 传数组
    {
        str[0] = '!';
        return str;
    }
    
    char *function(char *p) // 传指针
    {
        p[0] = '@';
        return p;
    }

    2.函数(型)指针(重点)

    函数指针:

      本质上是一个指针,因该指针指向的是一个函数而得名。

    为什么指针可以指向一个函数?

      函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。函数有自己的地址,那就好办了,我们的指针变量就是用来存储地址的。因此,可以利用一个指针指向一个函数。其中,函数名就代表着函数的地址

    函数指针的定义和使用:

    格式:

    函数的返回值类型 (*指针变量名)(形参1, 形参2, ...);
    
    • 其中“类型说明符”表示被指函数的返回值的类型。
    • “( 指针变量名)”表示“”后面的变量是定义的指针变量。
    • 最后的空括号表示指针变量所指的是一个函数。

    // 无参数,无返回值的函数型指针
    
    #include <stdio.h>
    void func();
    
    int main(int argc, const char * argv[]) {
    
        void (*funcP)(); // 定义指向函数的指针
        funcP = func; // 初始化 指向函数的 指针
    func(); // 方法一:函数调用 (*funcP)(); // 方法二: 利用指针调用函数 funcP(); // 方法三: 利用指针调用函数 } void func() { printf("我被执行了!"); }
    // 有参数,无返回值的函数型指针
    
    #include <stdio.h>
    void sum(int v1,int v2);
    
    int main(int argc, const char * argv[]) {
    
        void (*sumP)(int,int); // 定义一个指向函数的指针
        sumP = sum; // 初始化函数指针
    sumP(10,20); // 利用函数指针调用函数 (*sumP)(20,30); // 利用函数指针调用函数 // *sumP(20,30); // 错误写法,因为()的优先级高于* } void sum(int v1,int v2) { printf("sum = %d ",v1 + v2); }
    // 无参数,有返回值的函数型指针
    
    #include <stdio.h>
    int getAge();
    
    int main(int argc, const char * argv[]) {
    
        int (*getAgeP)();
        getAgeP = getAge;
    
        int age1 = getAgeP();  // 利用函数指针调用函数
        int age2 = (*getAgeP)(); // 利用函数指针调用函数
    
        printf("%d,%d",age1,age2);
    
    }
    
    int getAge()
    {
        return 26;
    }
    // 有参数,有返回值的函数型指针
    
    #include <stdio.h>
    int minus(int, int);
    
    int main(int argc, const char * argv[]) {
    
        int (*minusP)(int,int); // 定义一个指向函数的指针
        minusP = minus; // 初始化函数指针
    
        int res = (*minusP)(20,1); // 利用函数指针调用函数
        int result = minusP(90,9); // 利用函数指针调用函数
        printf("res = %d,result = %d
    ",res,result);
    }
    
    int minus(int val1, int val2)
    {
        return val1 - val2;
    }
    • 应用场景
      • 调用函数
      • 将函数作为参数在函数间传递

    使用注意:

    • 由于这类指针变量存储的是一个函数的入口地址,所以对它们作加减运算(比如p++)是无意义的
    • 函数调用中"(指针变量名)"的两边的括号不可少,其中的不应该理解为求值运算,在此处它 只是一种表示符号
  • 相关阅读:
    继承
    构造函数,重载
    Java Scanner学习记录
    20131204-数据库基础
    20131128-正则表达式与委托
    20131125-序列化与正则表达式
    20131127-正则表达式
    20131120-接口字符串-小鸭子练习
    20131118-静态类抽象类-外部设备
    20131117-练习面向对象
  • 原文地址:https://www.cnblogs.com/wsnb/p/4894891.html
Copyright © 2011-2022 走看看