搜索
bottom↓
回复: 43

可不可以不要用指针?我用指针头都痛了。

[复制链接]

出0入0汤圆

发表于 2012-5-10 05:43:14 | 显示全部楼层 |阅读模式
调了几天程序也不通,我想能不能不用指针呢?
程序是引用别人的。我自已相信这是可能的。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-5-10 06:40:15 | 显示全部楼层
当然可以  不过事倍功半

出0入0汤圆

发表于 2012-5-10 07:03:58 | 显示全部楼层
可以,不过效率会低很多。你要是能接受,就可以。将传址全部变成传值。

出0入0汤圆

发表于 2012-5-10 07:10:39 | 显示全部楼层
指针神器不解释

出0入0汤圆

发表于 2012-5-10 07:58:16 | 显示全部楼层
不过这关,在C编程方面永远进步不了

出0入0汤圆

发表于 2012-5-10 08:20:30 | 显示全部楼层
指针用好了就提升一个层次了

出0入8汤圆

发表于 2012-5-10 08:27:42 | 显示全部楼层
ls说的对,一旦使用指针就不想回到数组了

出0入0汤圆

发表于 2012-5-10 08:30:21 | 显示全部楼层
有些东西不用指针是完不成任务的。

出0入0汤圆

发表于 2012-5-10 08:41:08 | 显示全部楼层
告诉我谁逼你用指针了?我马上去打他屁屁
如果连指针都嫌麻烦那注定成不了一个优秀的coder。

出0入0汤圆

发表于 2012-5-10 08:47:33 来自手机 | 显示全部楼层
本帖最后由 stm8s 于 2012-5-10 09:01 编辑

很多时候用不到指针 ,等你用到时再学吧. 最重的是编程流程思想

出0入0汤圆

发表于 2012-5-10 09:02:57 | 显示全部楼层
牛人啊,不用指针哟

出0入0汤圆

发表于 2012-5-10 09:12:53 | 显示全部楼层
对指针不熟,同样痛苦中,但还是要想办法搞会

出0入0汤圆

发表于 2012-5-10 10:10:24 | 显示全部楼层
函数的传址上好像除了指针没别的办法了
取数组成员的话,连续取的话,我觉得用指针比较好吧
while(count--)
{
      getDat = *(pointer++) ;
}
而用数组的方法,我不清楚编译器会不会优化,感觉程序需要每次访问数组都要计算出要取的数据位置,可能相对麻烦了点,要做for循环,总归少不了自加,相等判断等

我个人的理解。。。不知对不对。。。

出0入0汤圆

发表于 2012-5-10 11:35:03 | 显示全部楼层
i55x 发表于 2012-5-10 11:19
我在8位单片机上面就从来不用指针。

8位单片机的间址指令太弱了,变址指令更是星级传说,C语言用指针的话 ...

是你没用过好用的8位单片机, 试试stm8吧,
间址,变址都有。。。寻址方式很丰富的。。。

出0入0汤圆

发表于 2012-5-10 12:00:24 | 显示全部楼层
直接用&取地址就可以不用指针了~~~~

出0入0汤圆

发表于 2012-5-10 15:26:41 | 显示全部楼层
本帖最后由 twitter 于 2012-5-10 15:28 编辑
i55x 发表于 2012-5-10 11:19
我在8位单片机上面就从来不用指针。

8位单片机的间址指令太弱了,变址指令更是星级传说,C语言用指针的话 ...


除非这位从来不开优化,否则在某个内存范围频繁间接访问(比如数组),指针操作优化程度比数组索引方式快得多。
数组索引在间接寻址时,每次还得额外计算增量的值,再与首地址求和。
而指针的话,avr一般用x、y、z寄存器组来保存地址的,汇编语句直接支持后增量。

出0入296汤圆

发表于 2012-5-10 15:45:46 | 显示全部楼层
i55x 发表于 2012-5-10 11:19
我在8位单片机上面就从来不用指针。

8位单片机的间址指令太弱了,变址指令更是星级传说,C语言用指针的话 ...

请举例说明。

出0入0汤圆

发表于 2012-5-10 15:47:22 | 显示全部楼层
i55x 发表于 2012-5-10 11:19
我在8位单片机上面就从来不用指针。

8位单片机的间址指令太弱了,变址指令更是星级传说,C语言用指针的话 ...

高人出现
观望中

出0入4汤圆

发表于 2012-5-10 16:13:27 | 显示全部楼层
指针很重要啊,我也不太熟悉。

出0入0汤圆

发表于 2012-5-10 16:37:58 | 显示全部楼层
i55x 发表于 2012-5-10 11:19
我在8位单片机上面就从来不用指针。

8位单片机的间址指令太弱了,变址指令更是星级传说,C语言用指针的话 ...

高人!膜拜中!

出0入0汤圆

发表于 2012-5-10 17:09:04 | 显示全部楼层
做图形界面还是离不开指针的。

出0入0汤圆

发表于 2012-5-10 18:45:51 | 显示全部楼层
等待大神回复

出0入0汤圆

发表于 2012-5-10 20:17:10 | 显示全部楼层
有时候用指针并非比用数组效率要高。。。

出0入0汤圆

发表于 2012-5-10 20:31:58 | 显示全部楼层
对指针有点晕,,,观望中

出0入0汤圆

发表于 2012-5-10 21:10:30 | 显示全部楼层
i55x 发表于 2012-5-10 11:19
我在8位单片机上面就从来不用指针。

8位单片机的间址指令太弱了,变址指令更是星级传说,C语言用指针的话 ...

高人,世界就靠你拯救了,程序员的地位就靠你提升了。

出0入0汤圆

发表于 2012-5-10 21:25:15 | 显示全部楼层
10楼哪里去了?

出0入0汤圆

 楼主| 发表于 2012-5-10 21:38:21 | 显示全部楼层
行了,让我头痛了几天的指针,今天程序终于通过,可以显示字符了。
我只改了一行程序,就好了。

原:PutGB1616(x+l*8, y, (unsigned char*) s)
改:PutGB1616(x+l*2, y, *s, *(s+1));
原来那条最后的(unsigned char*) s,我现在也没有搞明白是什么意思,
担是,有一点是肯定的,这条语句在 Keil 中编译的结果和
CVAVR中编译的结果是不一样的,Keil编译后正常显示
CVAVR编译后,显示不正常。

出0入0汤圆

发表于 2012-5-10 23:12:25 | 显示全部楼层
水平在底层煎熬中,今年准备多用用指针,上一台阶

出0入0汤圆

发表于 2012-5-10 23:31:08 | 显示全部楼层
前段时间,用c编二维链表,头都晕了,可还是得写,否则无法完成功能。幸好搞定,不过人也脱了层皮。用mfc就简单多了。

出0入0汤圆

发表于 2012-5-11 22:27:44 | 显示全部楼层
version[0]=23;
  version[1]=11;
        version[2]=00;
  version[3]=22;
  *version=23;
  *(version+1)=11;
  *(version+3)=00;
  *(version+4)=22;
经查看IAR反汇编窗口,用指针和用数组变量,编译结果一样的

出0入0汤圆

发表于 2012-5-11 23:26:44 | 显示全部楼层
本帖最后由 twitter 于 2012-5-11 23:28 编辑
NJ8888 发表于 2012-5-11 22:27
version[0]=23;
  version[1]=11;
        version[2]=00;

  1. version[0]=23;
  2.   version[1]=11;
  3.         version[2]=00;
  4.   version[3]=22;

  5. char *p=version;
  6.   *p++=23;
  7.   *p++=11;
  8.   *p++=00;
  9.   *p=22;
复制代码
试试在avr上比较这两种的情况。

出0入0汤圆

发表于 2012-5-12 06:41:13 | 显示全部楼层
本帖最后由 NJ8888 于 2012-5-12 06:50 编辑
twitter 发表于 2012-5-11 23:26
试试在avr上比较这两种的情况。


我一直没用过AVR ,还是抓图看IAR反汇编吧,第三种代码多了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-5-12 07:45:01 | 显示全部楼层
楼主,你这可以很好的机会啊。
慢慢学吧。把这个吃透了。你的层次会提高很多。
我刚学编程的时候跟你一样想。

出0入0汤圆

发表于 2012-5-12 08:03:53 | 显示全部楼层
等你C水平上来了以后你就会发现指针的重要性和优势。
头像被屏蔽

出0入0汤圆

发表于 2012-5-12 13:38:34 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2012-5-12 21:05:58 | 显示全部楼层
本帖最后由 twitter 于 2012-5-12 21:07 编辑
NJ8888 发表于 2012-5-12 06:41
我一直没用过AVR ,还是抓图看IAR反汇编吧,第三种代码多了



你的IAR开优化了么?如果在avrgcc上开了-0s优化,编译器的优化能力非常强,两者代码完全一致。
可以看到像version[1]这种访问方式,其实是直接通过完整地址来访问了,不是间接或变址寻址了,所以指针用不用都没什么优化。

但是如果是像下面这样,通过变量间接访问或遍历数组的话,指针优势是很强的。

普通的变量遍历方式,消耗164个时钟周期:


指针方式遍历,消耗101个时钟周期,而且代码也小了不少:


达夫设备,代码空间换速度,消耗78个时钟周期:

  1. #include <avr/io.h>

  2. uint8_t version[10];
  3. uint8_t version2[10]={11,22,33,44,55,66,77,88,99,0xaa};

  4. void copy(void) __attribute__((noinline));
  5. void copy(void)
  6. {
  7.         uint8_t i;
  8.         uint8_t *s=version2;
  9.         uint8_t *d=version;

  10.         for(i=0;i<10;i++)
  11.         {
  12.                 *d++=*s++;
  13.         }
  14. }

  15. void duff(void)
  16. {
  17.         uint8_t *from=version2;
  18.         uint8_t *to=version;

  19.         register uint8_t n = (10 + 7) / 8;   /* count > 0 assumed */
  20.         switch (10 % 8)
  21.         {
  22.         case 0:    do { *to++ = *from++;
  23.         case 7:     *to++ = *from++;
  24.         case 6:     *to++ = *from++;
  25.         case 5:     *to++ = *from++;
  26.         case 4:     *to++ = *from++;
  27.         case 3:     *to++ = *from++;
  28.         case 2:     *to++ = *from++;
  29.         case 1:     *to++ = *from++;
  30.                         } while (--n > 0);
  31.         }
  32. }

  33. int main(void)
  34. {
  35.         uint8_t i;

  36.         for(i=0;i<10;i++)
  37.         {
  38.                 version[i]=version2[i];
  39.         }

  40.         for(i=0;i<10;i++)
  41.         {
  42.                 version[i]=0;
  43.         }

  44.         copy();

  45.         for(i=0;i<10;i++)
  46.         {
  47.                 version[i]=0;
  48.         }

  49.         duff();

  50.         while(1);
  51. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-5-12 21:42:42 | 显示全部楼层
twitter 发表于 2012-5-12 21:05
你的IAR开优化了么?如果在avrgcc上开了-0s优化,编译器的优化能力非常强,两者代码完全一致。
可以看到 ...

我特意试过IAR,无论优化最高和最低这部分结果一样

出0入0汤圆

发表于 2012-5-12 21:59:40 | 显示全部楼层
NJ8888 发表于 2012-5-12 21:42
我特意试过IAR,无论优化最高和最低这部分结果一样

16位Thumb2的STR类指令没有后增量功能,如果是32位的就有了。

出0入0汤圆

 楼主| 发表于 2012-11-20 15:20:56 来自手机 | 显示全部楼层

cvavr中,字符串s,只能是放在flash中,所以编译不通过。

出0入0汤圆

发表于 2012-11-20 23:24:23 | 显示全部楼层
指针,指着针对你!

出0入4汤圆

发表于 2012-11-20 23:57:26 | 显示全部楼层
数组是绿叶,指针是红花
指针配上数组,绝了!

出0入0汤圆

发表于 2013-4-8 21:03:31 来自手机 | 显示全部楼层
路过.........

出0入0汤圆

发表于 2013-4-8 21:14:14 | 显示全部楼层
不用指针就用引用啊,哈哈,比指针好点,但在C中不常用,在C++就经常用来代替指针啦。

出0入0汤圆

 楼主| 发表于 2013-4-8 21:24:17 | 显示全部楼层
nongxiaoming 发表于 2013-4-8 21:14
不用指针就用引用啊,哈哈,比指针好点,但在C中不常用,在C++就经常用来代替指针啦。 ...

那你说,什么叫引用?
我对C不太很熟啊。
在我的程序里面有下面一条,其中的小数点是不是引用啊?
(*shoufa2[shoufa2pin].zTask)(); //运行这个任务
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 03:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表