zhwm3064 发表于 2012-5-10 05:43:14

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

调了几天程序也不通,我想能不能不用指针呢?
程序是引用别人的。我自已相信这是可能的。

xivisi 发表于 2012-5-10 06:40:15

当然可以不过事倍功半

tiancaigao7 发表于 2012-5-10 07:03:58

可以,不过效率会低很多。你要是能接受,就可以。将传址全部变成传值。

BloathX 发表于 2012-5-10 07:10:39

指针神器不解释

mowin 发表于 2012-5-10 07:58:16

不过这关,在C编程方面永远进步不了

usingavr 发表于 2012-5-10 08:20:30

指针用好了就提升一个层次了{:smile:}

lindabell 发表于 2012-5-10 08:27:42

ls说的对,一旦使用指针就不想回到数组了

lcofjp 发表于 2012-5-10 08:30:21

有些东西不用指针是完不成任务的。

dragon_hn 发表于 2012-5-10 08:41:08

告诉我谁逼你用指针了?我马上去打他屁屁{:titter:}
如果连指针都嫌麻烦那注定成不了一个优秀的coder。

stm8s 发表于 2012-5-10 08:47:33

本帖最后由 stm8s 于 2012-5-10 09:01 编辑

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

windboy 发表于 2012-5-10 09:02:57

牛人啊,不用指针哟

mcujack 发表于 2012-5-10 09:12:53

对指针不熟,同样痛苦中,但还是要想办法搞会

yurinacn 发表于 2012-5-10 10:10:24

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

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

snoopyzz 发表于 2012-5-10 11:35:03

i55x 发表于 2012-5-10 11:19 static/image/common/back.gif
我在8位单片机上面就从来不用指针。

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

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

xiaoziwen 发表于 2012-5-10 12:00:24

直接用&取地址就可以不用指针了~~~~{:tongue:}

twitter 发表于 2012-5-10 15:26:41

本帖最后由 twitter 于 2012-5-10 15:28 编辑

i55x 发表于 2012-5-10 11:19 static/image/common/back.gif
我在8位单片机上面就从来不用指针。

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

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

Gorgon_Meducer 发表于 2012-5-10 15:45:46

i55x 发表于 2012-5-10 11:19 static/image/common/back.gif
我在8位单片机上面就从来不用指针。

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

请举例说明。

mowin 发表于 2012-5-10 15:47:22

i55x 发表于 2012-5-10 11:19 static/image/common/back.gif
我在8位单片机上面就从来不用指针。

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

高人出现
观望中

qinglong 发表于 2012-5-10 16:13:27

指针很重要啊,我也不太熟悉。

dragon_hn 发表于 2012-5-10 16:37:58

i55x 发表于 2012-5-10 11:19 static/image/common/back.gif
我在8位单片机上面就从来不用指针。

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

高人!膜拜中!

Excellence 发表于 2012-5-10 17:09:04

做图形界面还是离不开指针的。

qqcanread 发表于 2012-5-10 18:45:51

等待大神回复

myqiang1990 发表于 2012-5-10 20:17:10

有时候用指针并非比用数组效率要高。。。

xiaoniu314 发表于 2012-5-10 20:31:58

对指针有点晕,,,观望中

lcofjp 发表于 2012-5-10 21:10:30

i55x 发表于 2012-5-10 11:19 static/image/common/back.gif
我在8位单片机上面就从来不用指针。

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

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

shark 发表于 2012-5-10 21:25:15

10楼哪里去了?

zhwm3064 发表于 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编译后,显示不正常。

shjw 发表于 2012-5-10 23:12:25

水平在底层煎熬中,今年准备多用用指针,上一台阶

Vincent2012 发表于 2012-5-10 23:31:08

前段时间,用c编二维链表,头都晕了,可还是得写,否则无法完成功能。幸好搞定,不过人也脱了层皮。用mfc就简单多了。

NJ8888 发表于 2012-5-11 22:27:44

version=23;
version=11;
        version=00;
version=22;
*version=23;
*(version+1)=11;
*(version+3)=00;
*(version+4)=22;
经查看IAR反汇编窗口,用指针和用数组变量,编译结果一样的

twitter 发表于 2012-5-11 23:26:44

本帖最后由 twitter 于 2012-5-11 23:28 编辑

NJ8888 发表于 2012-5-11 22:27 static/image/common/back.gif
version=23;
version=11;
        version=00;

version=23;
version=11;
      version=00;
version=22;

char *p=version;
*p++=23;
*p++=11;
*p++=00;
*p=22;
试试在avr上比较这两种的情况。

NJ8888 发表于 2012-5-12 06:41:13

本帖最后由 NJ8888 于 2012-5-12 06:50 编辑

twitter 发表于 2012-5-11 23:26 static/image/common/back.gif
试试在avr上比较这两种的情况。

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

smry 发表于 2012-5-12 07:45:01

楼主,你这可以很好的机会啊。
慢慢学吧。把这个吃透了。你的层次会提高很多。
我刚学编程的时候跟你一样想。

AVR_ARM 发表于 2012-5-12 08:03:53

等你C水平上来了以后你就会发现指针的重要性和优势。

sfpxfpcfp 发表于 2012-5-12 13:38:34

twitter 发表于 2012-5-12 21:05:58

本帖最后由 twitter 于 2012-5-12 21:07 编辑

NJ8888 发表于 2012-5-12 06:41 static/image/common/back.gif
我一直没用过AVR ,还是抓图看IAR反汇编吧,第三种代码多了


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

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

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


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


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

#include <avr/io.h>

uint8_t version;
uint8_t version2={11,22,33,44,55,66,77,88,99,0xaa};

void copy(void) __attribute__((noinline));
void copy(void)
{
        uint8_t i;
        uint8_t *s=version2;
        uint8_t *d=version;

        for(i=0;i<10;i++)
        {
                *d++=*s++;
        }
}

void duff(void)
{
        uint8_t *from=version2;
        uint8_t *to=version;

        register uint8_t n = (10 + 7) / 8;   /* count > 0 assumed */
        switch (10 % 8)
        {
        case 0:    do { *to++ = *from++;
        case 7:   *to++ = *from++;
        case 6:   *to++ = *from++;
        case 5:   *to++ = *from++;
        case 4:   *to++ = *from++;
        case 3:   *to++ = *from++;
        case 2:   *to++ = *from++;
        case 1:   *to++ = *from++;
                        } while (--n > 0);
        }
}

int main(void)
{
        uint8_t i;

        for(i=0;i<10;i++)
        {
                version=version2;
        }

        for(i=0;i<10;i++)
        {
                version=0;
        }

        copy();

        for(i=0;i<10;i++)
        {
                version=0;
        }

        duff();

        while(1);
}

NJ8888 发表于 2012-5-12 21:42:42

twitter 发表于 2012-5-12 21:05 static/image/common/back.gif
你的IAR开优化了么?如果在avrgcc上开了-0s优化,编译器的优化能力非常强,两者代码完全一致。
可以看到 ...

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

twitter 发表于 2012-5-12 21:59:40

NJ8888 发表于 2012-5-12 21:42 static/image/common/back.gif
我特意试过IAR,无论优化最高和最低这部分结果一样

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

zhwm3064 发表于 2012-11-20 15:20:56


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

xslff 发表于 2012-11-20 23:24:23

指针,指着针对你!

sunliezhi 发表于 2012-11-20 23:57:26

数组是绿叶,指针是红花
指针配上数组,绝了!

jz701209李 发表于 2013-4-8 21:03:31

路过.........

nongxiaoming 发表于 2013-4-8 21:14:14

不用指针就用引用啊,哈哈,比指针好点,但在C中不常用,在C++就经常用来代替指针啦。

zhwm3064 发表于 2013-4-8 21:24:17

nongxiaoming 发表于 2013-4-8 21:14 static/image/common/back.gif
不用指针就用引用啊,哈哈,比指针好点,但在C中不常用,在C++就经常用来代替指针啦。 ...

那你说,什么叫引用?
我对C不太很熟啊。
在我的程序里面有下面一条,其中的小数点是不是引用啊?
(*shoufa2.zTask)(); //运行这个任务
页: [1]
查看完整版本: 可不可以不要用指针?我用指针头都痛了。