指看下面的例子
char *a1;
char *a2;
char b1;
switch(b1)
{
case 0x01:
a1 = &b1;
break;
case 0x02:
a2 = &b2;
break;
default break;
}
当b1等于0x01时 a1指向b1,此时*a1 = 0x01即b1的值。
当b1等于0x02时 a2指向b1,此时*a2 = 0x02即b1的值。好,此时问题来了,当b1等于0x02是,*a1是多少?
答案是:0x02,并不是0x01。
如果在程序其它地方,b1被赋其它值,如0x05,则*a1和*a2均为0x05。
在上述程序中,只要两个case语句被执行过后,a1就等于a2了。只要b1发生变化,*a1和*a2也跟着发送变化。
a1和a2中存储的只是b1的地址。只要b1没被销毁,a1和a2的值不会改变。
在血压计项目中:
struct firstPageDis{
char* termintim;
char* rectim;
char* teminpress;
char* recpress;
char* cyctimes;
} fpDis;
//取有效数据
uData = 0;
memset(dStr,'\0',10);
for(fCnt=0; fCnt<(recDataCnt-1); fCnt++)
{
dStr[fCnt] = rDataUart[1+fCnt]; //取出有效数据(ascii形式)
rDataUart[1+fCnt] &= 0x0F; //有效数据ascii转10进制
uData += rDataUart[1+fCnt] * pow(10,(recDataCnt-2-fCnt)); //计算有效数据(十进制方式)
}
//根据命令将有效数据赋值给各个参数,并定义各数据显示位置
memset(outStr,'\0',80);
switch(uCmd)
{
case CMDTERMINTIME:
tmTerBd = uData;
fpDis.termintim = &dStr;
strcpy(outStr, "LABL(32,150,25,200,'");
break;
case CMDRECTIME:
tmRecoy = uData;
fpDis.rectim = &dStr;
strcpy(outStr, "LABL(32,150,85,200,'");
break;
case CMDTERMINPRESS:
prTerBd = uData;
fpDis.terminpress = &dStr;
strcpy(outStr, "LABL(32,150,145,200,'");
break;
case CMDRECPRESS:
prRecoy = uData;
fpDis.recpress = &dStr;
strcpy(outStr, "LABL(32,150,205,200,'");
break;
case CMDCYCTIMES:
cycTimes = uData;
fpDis.cyctimes = &dStr;
strcpy(outStr, "LABL(32,150,265,200,'");
break;
default:
break;
}
如上程序所示,本意是每次输入数据后,根据不同命令下取到的参数要一一对应,参数字符也根据命令的不同赋值给不同的字符串fpDis.xxxx。
此时就出现了错误:
错误:保存参数字符的buf不应该是指针变量,如fpDis.terminpress (char *型)
因为获得数据后保存的buffer--dStr是一个固定的变量,不管用多少指针指向后,不会因为指针名称的改变,影响dStr的地址。
以为当命令是CMDTERMINTIME时,获得的数据(比如“ABC")保存到fpDis.termintim中,当命令是CMDCYCTIMES时,获得的数据(比如“DEF")保存到fpDis.cyctimes 中,但实际是只要每个分支执行过后,*fpDis.termintim 或 *fpDis.cyctimes的内容全跟着dStr时时在变,并且是相同值,无法单独保存”ABC“或"DEF"。