指针你高效在哪里?

工作也快7年了,前面6年都在写C的代码,最近一年开始写C#的代码,估计以后用C的机会可能会变少,写写这几年用C的一些思考吧,有些问题也是我经常面试别人用的,希望在园子里有需要的兄弟看到。

开门见山我就直接说了,和标题一样,C语言中都说指针高效,那么到底指针高效灵活在那呢?

在上学的时候从谭浩强的C语言书中学习指针,当时我记得书中举得例子是,打开一个抽屉,有两种办法,一种是将钥匙带着身上,一种是将钥匙放在另一个抽屉中,显而易见第一种就是我们一边的变量(如int,short,float,struct 等等基本的变量)。而第二种就是指针变量(如int*,short*,float*,struct*等等),也就是所谓的间接访问。

从上面的介绍来看,间接访问也就是指针的这种访问怎么能高效呢?答案是,这种访问方式在单个变量上来看就是 不高效 。可以为什么大家都说指针高效,在这块根本就不高效为什么要用这个例子呢?我想应该是谭老师为了吧指针的原理和定义给大家说的更简单一点吧!

可能有人会问了,那么要指针有什么用?

我还是要说指针高效啊!请注意,上面的举例在解释指针上确实是正确的,指针原理就是这么回事?但是如果只是单一的变量确实是低效的

int i = 0;

int * p = &i;

*p = 5;

i = 6;

在这种情况下指针变量P的访问效率和整形变量i的效率谁高呢?着个例子就和刚才说的抽屉是一样的,显然i的访问效率要高一点

先讲讲用i来赋值,程序将会直接取到i变量的内存地址,然后操作着个内存地址进行赋值。

而对于p,程序会先取得p变量的内存地址,然后从p的内存地址中读到i变量的内存地址,在用读到的这个i变量的内存地址进行赋值,是不是显然多走了一步(读取i的内存地址),请注意p也是一个变量,p的变量中存放的就是i的地址值(扫一下盲)

在上面的例子中可以看出指针的使用是低效的!

下面再来看看指针的高效,到底是怎么用,其实很多用法,我还是举一个让大家理解一下原理的例子和刚才相似的例子

struct aa

{

    int gg[1000];

  char p;

} mm;

 

void Test1(struct aa b);

void Test2(struct aa *p);

大家一看这个例子就明白了,struct aa 中包含了一个含有1000个元素的数组和一个char(char只为凑个数),如果我们使用Test1这个函数回发生什么情况,实参需要向形参拷贝数据,这么大的数据量,你认为会快吗,显然不会,那如果用Test2函数呢,直传一个指针,不需要进行数据的拷贝,是不是效率就高了,虽然使用指针会间接访问这个struct这个变量降低效率,但是和拷贝大的数据相比,降低的效率和提升的效率简直是9牛1毛

后面会再给大家讲讲指针的灵活,到底灵活在哪里?

 

转载于:https://www.cnblogs.com/mapsteve/archive/2012/08/26/2657550.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值