这里就是记录以前面试时遇到的问题。
1.写出下面C代码的含义:
》》》float (** p)[5];
含义:p是一个二级指针,指向的是一个含有5个float型元素的数组。
》》》int (* p)(float);
含义:p是一级指针,指向的是返回值为int型的函数。
》》》long *(*p)[5];
含义:p是一级指针,指向的是含有5个元素的数组,每个元素是一个long指针。
解释:
》》int *p(float ,int ) 指针函数,本质是函数,返回值是指向int型数据的指针
》》int (*p)(float , int ) 函数指针,本质是指针,指针指向的是一个返回值为int型的函数
》》int *(*p)(float , float) 函数指针,本质是指针,指针指向的是一个返回值为指针的函数
示例:
》int(*p)[5],p是什么意思?
p是指向一个有5个int元素数组的指针。
》int *p[5],p是什么意思?
p是一个含有5个元素的数组,每一个元素都是一个int指针。
2.自JDK1.7后,switch分支语句可以用String来分支变量,其原理是什么?
解答:在 switch 语句中可以使用与整数类型兼容的类型:int short byte char,因为后三种类型可以自动提升为int类型。
JDK1.7之后,又支持了String类型。
原理:
实际上,这个新特性是在编译器这个层次上实现的。而在 Java 虚拟机和字节代码这个层次上,还是只支持在 switch 语句中使用与整数类型兼容的类型。
这么做的目的是为了减少这个特性所影响的范围,以降低实现的代价。在编译器层次实现的含义是,虽然开发人员在 Java 源代码的 switch 语句中使用了字符串类型,但是在编译的过程中,编译器会根据源代码的含义来进行转换,将字符串类型转换成与整数类型兼容的格式。
原理就是用在 switch 语句中的字符串被替换成了对应的哈希值,而 case 子句的值也被换成了原来字符串常量的哈希值。经过这样的转换,Java 虚拟机所看到的仍然是与整数类型兼容的类型。在这里值得注意的是,在 case 子句对应的语句块中仍然需要使用 String 的 equals 方法来进行字符串比较。这是因为哈希函数在映射的时候可能存在冲突,多个字符串的哈希值可能是一样的。进行字符串比较是为了保证转换之后的代码逻辑与之前完全一样。