指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。
要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。让我们分别说明。例一
- (1)int*ptr;
- (2)char*ptr;
- (3)int**ptr;
- (4)int(*ptr)[3];
- (5)int*(*ptr)[4];
例二:
- char a[20];
- int *ptr=(int *)a; //强制类型转换并不会改变a 的类型
- ptr++;
- 数组的介绍和应用
数组可以持有某种具体类型和任意基本类型。而在泛型和自动包装机制之前之前,容器类在处理对象时,都将它们视为Object处理,并且无法持有基本类型。
在有了泛型和自动包装机制后,数组与其他种类的容器之间本质的优势在于效率:在Java中,数组是一种效率最高的存储和随机访问对象引用序列的方式。数组就是一个简单的线性序列,这使得元素访问非常迅速。但其缺点是数组大小在其初始化时就被固定,并无法改变。 ArrayList通过创建一个新实例,然后将旧实例中所有引用移到新实例中,从而实现更多空间的自动分配,这也大大增加了开销。因此ArrayList的效率比数组低很多。
下面是将数组与泛型容器进行比较的示例:
class BerylliumSphere {
private static long counter;
private final long id = counter++;
public String toString() { return "Sphere " + id; }
}
public class ContainerComparison {
public static void main(String[] args) {
BerylliumSphere[] spheres = new BerylliumSphere[10];
for (int i = 0; i < 5; i++)
spheres[i] = new BerylliumSphere();
print(Arrays.toString(spheres));
print(spheres[4]);
List<BerylliumSphere> sphereList = new ArrayList<BerylliumSphere>();
for (int i = 0; i < 5; i++)
sphereList.add(new BerylliumSphere());
print(sphereList);
print(sphereList.get(4));
int[] integers = { 0,1,2,3,4,5 };
print(Arrays.toString(integers));
print(integers[4]);
List<Integer> intList = new ArrayList<Integer>(Arrays.asList(0,1,2,3,4,5));
intList.add(66);
print(intList);
print(intList.get(4));
}
}
随着泛型的出现,容器类和数组都是类型检查型的了。唯一明显的差异就是访问元素的方式有所不同。并且,随着自动包装机制的出现,数组仅存的优点就是效率了。但容器比数组明显具有更多功能。