C指针和数组

时间:2022-09-03 10:23:27

指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。

要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。让我们分别说明。例一

  1. (1)int*ptr;  
  2. (2)char*ptr;  
  3. (3)int**ptr;  
  4. (4)int(*ptr)[3];  
  5. (5)int*(*ptr)[4]; 
指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的,以单元为单位。例如:
例二:
  1. char a[20];  
  2. int *ptr=(int *)a; //强制类型转换并不会改变a 的类型  
  3. ptr++;    
  4. 数组的介绍和应用

数组可以持有某种具体类型和任意基本类型。而在泛型和自动包装机制之前之前,容器类在处理对象时,都将它们视为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));
    }
}

随着泛型的出现,容器类和数组都是类型检查型的了。唯一明显的差异就是访问元素的方式有所不同。并且,随着自动包装机制的出现,数组仅存的优点就是效率了。但容器比数组明显具有更多功能。