C语言数组和指针

1.以下标的形式去访问,例如a[1]=1;a[2]=2;

 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.指针的本质是变量,其中保存的值是内存中的地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值