【精通JVM基础篇】一:指针函数与函数指针的用法
最近有很多同学在面试中被问到了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.函数指针声明的是一个指针,指向函数的首地址。