查看原文
其他

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

凤澜 云下风澜 2022-07-26

    最近有很多同学在面试中被问到了JVM原理相关的面试题,因此小编就想写一个JVM原理相关的一系列文章,希望能帮到大家,拿到高薪offer。


    首先,前几篇文章小编准备先写一写关于C/C++的一些知识,因为你要是想研究JVM的原理,必看JVM的源码,看JVM源码,就必须要懂一些C/C++知识,因为JVM就是用C/C++进行编写的。

     今天我们就一起来了解一下JVM框架中使用较多且易混淆的两个概念,“指针函数”和“函数指针”,它们是实现C语言动态扩展能力的关键技术之一,如Java中的反射与类动态加载技术,就是通过它们实现的。

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

1. 指针函数

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


2. 函数指针

       函数指针声明的是一个指针,只不过这个指针与一般的指针不同,一般的指针指向一个变量的内存地址,函数指针指向一个函数的首地址。

      如下图:我们通过三种方式定义了函数指针

      函数外部声明函数指针,声明后可直接在方法内部将函数指针指向具体函数。

      方法内部直接声明函数指针,相当于直接定义了一个变量,可以直接对改变量进行赋值。

      通过类型声明,就是先定义一个类型,然后通过类型去声明函数指针,类型声明的方式和直接声明的方式相比,只要的区别在于,通过类型声明的方式定义的仅仅是一个类型,由这个类型无法直接取初始化函数指针,因为类型不是变量,想要使用这种类型,就必须使用类型名去声明一个函数指针变量,然后才能为所声明的函数指针赋值。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.函数指针声明的是一个指针,指向函数的首地址。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存