可不可以不要用指针?我用指针头都痛了。
调了几天程序也不通,我想能不能不用指针呢?程序是引用别人的。我自已相信这是可能的。 当然可以不过事倍功半 可以,不过效率会低很多。你要是能接受,就可以。将传址全部变成传值。 指针神器不解释 不过这关,在C编程方面永远进步不了 指针用好了就提升一个层次了{:smile:} ls说的对,一旦使用指针就不想回到数组了 有些东西不用指针是完不成任务的。 告诉我谁逼你用指针了?我马上去打他屁屁{:titter:}
如果连指针都嫌麻烦那注定成不了一个优秀的coder。 本帖最后由 stm8s 于 2012-5-10 09:01 编辑
很多时候用不到指针 ,等你用到时再学吧. 最重的是编程流程思想 牛人啊,不用指针哟 对指针不熟,同样痛苦中,但还是要想办法搞会 函数的传址上好像除了指针没别的办法了
取数组成员的话,连续取的话,我觉得用指针比较好吧
while(count--)
{
getDat = *(pointer++) ;
}
而用数组的方法,我不清楚编译器会不会优化,感觉程序需要每次访问数组都要计算出要取的数据位置,可能相对麻烦了点,要做for循环,总归少不了自加,相等判断等
我个人的理解。。。不知对不对。。。 i55x 发表于 2012-5-10 11:19 static/image/common/back.gif
我在8位单片机上面就从来不用指针。
8位单片机的间址指令太弱了,变址指令更是星级传说,C语言用指针的话 ...
是你没用过好用的8位单片机, 试试stm8吧,
间址,变址都有。。。寻址方式很丰富的。。。 直接用&取地址就可以不用指针了~~~~{:tongue:} 本帖最后由 twitter 于 2012-5-10 15:28 编辑
i55x 发表于 2012-5-10 11:19 static/image/common/back.gif
我在8位单片机上面就从来不用指针。
8位单片机的间址指令太弱了,变址指令更是星级传说,C语言用指针的话 ...
除非这位从来不开优化,否则在某个内存范围频繁间接访问(比如数组),指针操作优化程度比数组索引方式快得多。
数组索引在间接寻址时,每次还得额外计算增量的值,再与首地址求和。
而指针的话,avr一般用x、y、z寄存器组来保存地址的,汇编语句直接支持后增量。
i55x 发表于 2012-5-10 11:19 static/image/common/back.gif
我在8位单片机上面就从来不用指针。
8位单片机的间址指令太弱了,变址指令更是星级传说,C语言用指针的话 ...
请举例说明。 i55x 发表于 2012-5-10 11:19 static/image/common/back.gif
我在8位单片机上面就从来不用指针。
8位单片机的间址指令太弱了,变址指令更是星级传说,C语言用指针的话 ...
高人出现
观望中 指针很重要啊,我也不太熟悉。 i55x 发表于 2012-5-10 11:19 static/image/common/back.gif
我在8位单片机上面就从来不用指针。
8位单片机的间址指令太弱了,变址指令更是星级传说,C语言用指针的话 ...
高人!膜拜中!
做图形界面还是离不开指针的。
等待大神回复 有时候用指针并非比用数组效率要高。。。 对指针有点晕,,,观望中 i55x 发表于 2012-5-10 11:19 static/image/common/back.gif
我在8位单片机上面就从来不用指针。
8位单片机的间址指令太弱了,变址指令更是星级传说,C语言用指针的话 ...
高人,世界就靠你拯救了,程序员的地位就靠你提升了。 10楼哪里去了? 行了,让我头痛了几天的指针,今天程序终于通过,可以显示字符了。
我只改了一行程序,就好了。
原:PutGB1616(x+l*8, y, (unsigned char*) s)
改:PutGB1616(x+l*2, y, *s, *(s+1));
原来那条最后的(unsigned char*) s,我现在也没有搞明白是什么意思,
担是,有一点是肯定的,这条语句在 Keil 中编译的结果和
CVAVR中编译的结果是不一样的,Keil编译后正常显示
CVAVR编译后,显示不正常。 水平在底层煎熬中,今年准备多用用指针,上一台阶 前段时间,用c编二维链表,头都晕了,可还是得写,否则无法完成功能。幸好搞定,不过人也脱了层皮。用mfc就简单多了。 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: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:50 编辑
twitter 发表于 2012-5-11 23:26 static/image/common/back.gif
试试在avr上比较这两种的情况。
我一直没用过AVR ,还是抓图看IAR反汇编吧,第三种代码多了 楼主,你这可以很好的机会啊。
慢慢学吧。把这个吃透了。你的层次会提高很多。
我刚学编程的时候跟你一样想。 等你C水平上来了以后你就会发现指针的重要性和优势。 本帖最后由 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);
}
twitter 发表于 2012-5-12 21:05 static/image/common/back.gif
你的IAR开优化了么?如果在avrgcc上开了-0s优化,编译器的优化能力非常强,两者代码完全一致。
可以看到 ...
我特意试过IAR,无论优化最高和最低这部分结果一样 NJ8888 发表于 2012-5-12 21:42 static/image/common/back.gif
我特意试过IAR,无论优化最高和最低这部分结果一样
16位Thumb2的STR类指令没有后增量功能,如果是32位的就有了。
cvavr中,字符串s,只能是放在flash中,所以编译不通过。 指针,指着针对你! 数组是绿叶,指针是红花
指针配上数组,绝了! 路过......... 不用指针就用引用啊,哈哈,比指针好点,但在C中不常用,在C++就经常用来代替指针啦。 nongxiaoming 发表于 2013-4-8 21:14 static/image/common/back.gif
不用指针就用引用啊,哈哈,比指针好点,但在C中不常用,在C++就经常用来代替指针啦。 ...
那你说,什么叫引用?
我对C不太很熟啊。
在我的程序里面有下面一条,其中的小数点是不是引用啊?
(*shoufa2.zTask)(); //运行这个任务
页:
[1]