关于一个栈的程序段[请问]
unchar * copyf(unchar *destp, const unchar *scrp,usint length)
{ register signed long count;
uchar *retp;
count = (signed long)(length);
rept = destp;
while( --count> =0){
*((unchar*)destp)++ = *((unchar *)scrp)++;
}
return(retp);
请问: 1,为什么 count 要定义成 signed long 型? 寄存器变量register 为什么不定义为char型?
2,为什么要把整型的length 强制转换成有符号长整形,这里作者一定要把count 用有符号长整型表示,有什么特殊的用意或计算机有什么内在的工作原理不得不这样么?
3,*((unchar*)destp)++ = *((unchar *)scrp)++; 一句是什么意思?太多*号有点糊涂了。
4,函数的参数已经定义了 unchar *destp ,为什么 *((unchar*)destp)++ = *((unchar *)scrp)++; 这个语句中还得再定义一次(unchar *) destp 呢?
感谢各位前辈的详细耐心解答,谢谢了。
[解决办法]
1.因为这个函数在下面使用了 while( --count> =0),count明显应该是有符号函数,否则此判别式恒为TRUE,变成死循环了。但如果定义成char,其表示范围小于那传入的参数uint length,不合适。因此没考虑硬件CPU的特点,光从代码的实现角度只能是有符号的long,或者int。
2.这个问题在1中我已经提到,一方面这是和编程序思路来的,对于寄存器变量类型的选择,本人也只略知一二,但是也应该和具体CPU相关,不同的CPU是有不同的特性的。
3.*((unchar*)destp)++ = *((unchar *)scrp)++;
将源数据赋值给目标数据,以指针实现数据 copy的作用
首先scrp(是指向unchar的const,意思是所指变量是个只读无符号字符)是个指针,*((unchar *)scrp,指针强制转换,*((unchar *)scrp)++实现取变量值的功能,并指针自加,指向下个数据,前面的也目标指针也是这样的。
4.这个不是重定义,只是做了个强制类型的保护,看了代码,应该可以不用这个。直接
*destp++ = *((unchar *)scrp)++;
不知道以上答案是否让人满意!