【精通JVM基础篇】一:指针函数与函数指针的用法

215 阅读3分钟

最近有很多同学在面试中被问到了JVM原理相关的面试题,因此小编就想写一个JVM原理相关的一系列文章,希望能帮到大家,拿到高薪offer。 首先,前几篇文章小编准备先写一写关于C/C++的一些知识,因为你要是想研究JVM的原理,必看JVM的源码,看JVM源码,就必须要懂一些C/C++知识,因为JVM就是用C/C++进行编写的。

众所周知,指针在C/C++中占有着非常严重的地位,今天我们就一起先来简单了解一下JVM框架中使用较多且易混淆的两个概念,“指针函数”和“函数指针”,它们是实现C语言动态扩展能力的关键技术之一,如Java中的反射与类动态加载技术,就是通过它们实现的。

“指针函数 ”与“函数指针”的用法

  • 指针函数

    如下图add函数就是一个指针函数,与一般的函数并无大多的区别,唯一的区别的就是指针函数返回的是一个指针,指向函数返回值所在的内存地址,而一般函数返回的是普通变量类型。 在这里插入图片描述

  • 函数指针

    函数指针声明的是一个指针,只不过这个指针与一般的指针不同,一般的指针指向一个变量的内存地址,函数指针指向一个函数的首地址。 如下代码:我们通过三种方式定义了函数指针 1.函数外部声明函数指针,声明后可直接在方法内部将函数指针指向具体函数。 2.方法内部直接声明函数指针,相当于直接定义了一个变量,可以直接对改变量进行赋值。 3.通过类型声明,就是先定义一个类型,然后通过类型去声明函数指针,类型声明的方式和直接声明的方式相比,只要的区别在于,通过类型声明的方式定义的仅仅是一个类型,由这个类型无法直接取初始化函数指针,因为类型不是变量,想要使用这种类型,就必须使用类型名去声明一个函数指针变量,然后才能为所声明的函数指针赋值。JVM中的call_stub(方法调用)函数指针就是通过这种方式来声明的

#include <iostream>
#include "stdio.h"

//声明函数指针
int (*aP)(int a,int b);

int add(int a,int b);

int main() {

    int a = 1;
    int b = 2;

    //方法内部直接声明函数指针
//    int (*aP2)(int a,int b);
//    aP2 = add;
//    int c = aP2(a,b);
//    printf("%d",c);

    //通过类型声明函数指针
//    typedef (*aP3)(int a,int b);
//    aP3 ap3;
//    ap3 = add;
//    int e = ap3(a,b);
    printf("%d",e);
    //将函数指针指向add()函数首地址
    aP = add;
    int d = aP(a,b);

    printf("%d",d);

    return 0;
}
int add(int a,int b){
    int c = a + b;
    return c;
}

总结:

1.指针函数声明的是一个函数,与一般函数的差别就是,一般函数返回的是变量,而指针函数返回的是指向这个变量的内存地址。 2.函数指针声明的是一个指针,指向函数的首地址。

我是凤澜,一个喜欢研究底层,喜欢各种黑科技的技术人。
个人技术公众号:云下风澜