2.以指针的形式去访问,例如*(a+1)=3;*(a+3)=5;
从理论上而言,当指针以固定增量在数组中移动时,其效率高于下标产生的代码,并且当指针增量为1且硬件具有硬件增量模型时,表现更佳。
但是现在编译器生成代码的优化率已经大大的提高,在固定增量的时候,下标的效率已经和指针相当,但是从代码可读性和可维护性的角度来看,下标具有优势。
之所以指针的效率高,拿赋值语句做比较,指针进行的是*p1++=*p2++,其中需要进行的是自增运算,但是数组比如a[i]=a[j],需要用首地址+i或者j*sizeof(type),这其中包含一个乘法运算,所以效率就慢在这里了。
C语言中可以用clock()得到当前的毫秒数,可以写一个例子start存放执行前的代码,结束后可以end=clock(),然后相减得到程序运行的时间,这里就不做演示了。
a和&a的区别
这部分我觉得是最重要的了,之前也讨论过数组地址和数组首元素的地址的区别,虽然值是一样的,但是意义不同,这里在进行指针运算的时候区别就出来了:
a代表的是数组首元素的地址;
&a代表的是数组的地址;
指针运算具有区别:
a+1=(unsigned int)a+sizeof(*a),a的绝对值加上里面元素的大小
&a+1=(unsigned int)(&a)+sizeof(*&a)。a的绝对值加上整个数组的大小,因为&和*是一个相反的运算,最后其实就是a。这里&a+1就指向数组的末尾了。
、数组参数
C语言中,数组作为函数参数的时候,编译器将其编译成对应的指针,所以一般情况下,当定义的函数中有数组作为参数的时候,需要定义另外一个变量声明数组元素的个数,也就是数组的大小,就像下面,无论你声明不声明数组大小,在作为函数参数的时候,到了编译器处理的时候全部转化为一个指针,在该函数里面使用sizeof(a)的时候,一般都是等于4,而不是数组的实际大小。
voidf(int a[]) è voidf(int* a);
voidf(int a[5]) è voidf(int* a);
八、指针和数组的对比
1.数组声明的时候,编译器自动分配一片连续的内存空间。
2.指针分配得时候,值分配了容纳指针大小的4字节空间。
3.在作为函数参数的时候,数组参数和指针参数等价。
4.数组名在多数情况下可以看做常量指针,其值不会被改变。
5.指针的本质是变量,其中保存的值是内存中的地址。